How to select network interface when connecting to SFTP with JSch

前端 未结 3 1827
心在旅途
心在旅途 2021-01-14 15:33

I am facing problem to create a session to a remote SFTP server by JSch:

The command i use to connect the sftp server through shell is:



        
相关标签:
3条回答
  • 2021-01-14 16:05

    I do not think there's an explicit support for selecting a network interface to connect from in JSch.

    But you can implement a SocketFactory interface, such as that it creates a Socket instance using the constructor overload with the localAddr:

    public Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
    

    (use 0 for the localPort)

    Then pass the factory to the Session.setSocketFactory() before calling the connect() and you should be good.

    0 讨论(0)
  • 2021-01-14 16:24

    I have implemented the solution , I added the following code before calling session.connect().

    session.setSocketFactory(new SocketFactory() 
    {
        InputStream in = null;
        OutputStream out = null;
    
        public InputStream getInputStream(Socket socket) throws IOException 
        {
            if (in == null)
                in = socket.getInputStream();
            return in;
        }
    
        public OutputStream getOutputStream(Socket socket) throws IOException 
        {
            if (out == null)
                out = socket.getOutputStream();
            return out;
        }
    
        public Socket createSocket(String host, int port) throws IOException, UnknownHostException 
        {
           // The IP Addresses are changed ....
           // using the original IP in my code
            byte[] remoteIpAddr = new byte[] { (byte) 11,(byte) 11, 11, 11 }; 
            byte[] localIpAddr = new byte[] { 55, 55, 55, 55 };
    
            InetAddress remoteIp = InetAddress.getByAddress(remoteIpAddr);
            InetAddress localIp = InetAddress.getByAddress(localIpAddr);
    
            logger.debug("remoteIp >>" + remoteIp.toString());
            logger.debug("localIp >>" + localIp.toString());
            Socket socket = new Socket(remoteIp, 22, localIp, 0);
            logger.debug("socket created >> " + socket.toString());
            return socket;
        }
    });
    

    And its creating the socket : checked the log file for >>

    logger.debug("socket created >> " + socket.toString());
    

    But now I am getting an exception :

    Auth cancel

    What may be the cause , The key which I have is a id_rsa.pub file, which starts with

    ssh-rsa AXTYU....
    

    and I have created the private key file from this file through keygen which I am using in my session.addIdentity() method, the format of the private key is :

    -----BEGIN RSA PRIVATE KEY-----
    KIOPU.....
    -----END RSA PRIVATE KEY-----
    

    Am i missing something , please suggest...

    0 讨论(0)
  • 2021-01-14 16:24

    This will allow you to bind to a specific address (and port, should to need to): https://stackoverflow.com/a/56120718/11173046

    0 讨论(0)
提交回复
热议问题