Esempio n. 1
0
 protected SSHChannel(SSHConnection con, ChannelType type, int local_id)
 {
     con.ChannelCollection.RegisterChannel(local_id, this);
     _connection = con;
     _type       = type;
     _localID    = local_id;
 }
Esempio n. 2
0
        private static SSHConnection ConnectMain(SSHConnectionParameter param, ISSHConnectionEventReceiver receiver, VersionExchangeHandler pnh, AbstractGranadosSocket s)
        {
            DataFragment data = pnh.WaitResponse();
            string       sv   = pnh.ServerVersion;

            SSHConnection con = null;

            if (param.Protocol == SSHProtocol.SSH1)
            {
                throw new SSHException("SSH1 is not supported");
            }
            else
            {
                con = new SSH2Connection(param, s, receiver, sv, SSHUtil.ClientVersionString(param.Protocol));
            }

            con.TraceReceptionEvent("server version-string", sv.Trim());
            pnh.Close();
            s.SetHandler(con.PacketBuilder);
            con.SendMyVersion(param);

            if (con.Connect() != AuthenticationResult.Failure)
            {
                return(con);
            }
            else
            {
                s.Close();
                return(null);
            }
        }
Esempio n. 3
0
 protected SSHChannel(SSHConnection con, ChannelType type, int local_id) {
     con.ChannelCollection.RegisterChannel(local_id, this);
     _connection = con;
     _type = type;
     _localID = local_id;
 }
Esempio n. 4
0
    /// <summary>
    /// Connect to remote host:port over SSH tunnel
    /// </summary>
    public void Connect(string host, int port, int timeout)
    {
      try
      {
        //remember remote target
        m_RemoteTarget = new IPEndPoint(ResolveHost(host), port);

        //connect to SSH server
        if (!connectAsync(m_RemoteTarget.Address, SSHServerPort).Wait(timeout))
          throw new ErlException(ERL_CONN_CANT_CONNECT_TO_HOST_ERROR.Args("SSH", host, port));

        //get password from user
        var pass                 = ErlTransportPasswordSource.GetPassword(this, NodeName, SSHUserName);

        //set params
        var param                = new SSHConnectionParameter();
        param.EventTracer        = this; //to receive detailed events
        param.UserName           = SSHUserName;
        param.Password           = pass;
        param.Protocol           = SSHProtocol.SSH2;
        param.AuthenticationType = (AuthenticationType)
                                   Enum.Parse(typeof (SSH.AuthenticationType), SSHAuthenticationType);

        if (param.AuthenticationType == AuthenticationType.PublicKey)
          param.IdentityFile = SSHPrivateKeyFilePath;

        //former algorithm is given priority in the algorithm negotiation
        param.PreferableHostKeyAlgorithms = new PublicKeyAlgorithm[]
                                            {PublicKeyAlgorithm.RSA, PublicKeyAlgorithm.DSA};
        param.PreferableCipherAlgorithms  = new CipherAlgorithm[]
        {
          CipherAlgorithm.Blowfish, CipherAlgorithm.TripleDES, CipherAlgorithm.AES192CTR,
          CipherAlgorithm.AES256CTR, CipherAlgorithm.AES128CTR
        };

        param.WindowSize            = 0x1000; //this option is ignored with SSH1

        //Creating a new SSH connection over the underlying socket
        m_Connection                = SSHConnection.Connect(param, this, m_Client);
        m_Connection.AutoDisconnect = true;
        m_IsChannelReady            = 0;

        //Local->Remote port forwarding (we use localhost:0 as local port, because local port is not required for us, we will use this tunnel directly)
        m_Channel = m_Connection.ForwardPort(this, host, port, "localhost", 0);
        var deadLine = DateTime.Now.AddMilliseconds(timeout);
        while (m_IsChannelReady == 0 && deadLine > DateTime.Now)
          System.Threading.Thread.Sleep(50); //wait response

        //if timeouted - throw exception
        if (m_IsChannelReady <= 0)
          throw new ErlException(ERL_CREATE_SSH_TUNNEL_ERROR);

        //create network stream
        m_Stream = new SshTunnelStream(m_Channel);

        //Remote->Local
        // if you want to listen to a port on the SSH server, follow this line:
        //_conn.ListenForwardedPort("0.0.0.0", 10000);

        //NOTE: if you use SSH2, dynamic key exchange feature is supported.
        //((SSH2Connection)_conn).ReexchangeKeys();
      }
      catch (Exception ex)
      {
        OnTrace(ErlTraceLevel.Ctrl, Direction.Inbound, ex.Message);
        throw;
      }
    }