使用JSch连接SFTP时如何选择网络接口

我正面临着由JSch创建到远程SFTP服务器的会话的问题:

我用来通过shell连接sftp服务器的命令是:

sftp -o BindAddress=SOME_IP_ADDRRESS myUserName@HOST_IP_ADDR 

并且它的工作正常,但是当我尝试Java(JSch)时,我得到一个超时exception。 Java代码是

 /* KEY_FILE_NAME = is a file with rsa public key */ ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource(KEY_FILE_NAME).getFile()); JSch jsch = new JSch(); jsch.addIdentity(file.getAbsolutePath()); Properties hash = new Properties(); hash.put("StrictHostKeyChecking", "no"); logger.debug("SSh Server Host name >>" + SSH_SERVER_HOST_NAME + " || User Name >>" + SSH_SERVER_USER_NAME); session = jsch.getSession(SSH_SERVER_USER_NAME, SSH_SERVER_HOST_NAME); UserInfo ui = new MyUserInfo(); session.setUserInfo(ui); session.setConfig(hash); session.setPort(22); session.setTimeout(45000); session.connect(); 

我得到的例外是:

com.jcraft.jsch.JSchException:timeout:未建立套接字

我猜它会来,因为我没有使用-o选项设置BindAddress ,而我正在使用shell命令。 如果是这种情况,那么如何在JSch中设置-o BindAddress参数? 或者我做错了什么,请建议。

我不认为在JSch中选择要连接的网络接口有明确的支持。

但是你可以实现一个SocketFactory接口,比如它使用带有localAddr的构造函数重载创建一个Socket实例:

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

(对localPort使用0)

然后在调用connect()之前将工厂传递给Session.setSocketFactory() connect() ,你应该很好。

我已经实现了解决方案,我在调用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; } }); 

并创建套接字:检查日志文件>>

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

但现在我得到一个例外:

validation取消

可能是什么原因,我的关键是id_rsa.pub文件,它以

 ssh-rsa AXTYU.... 

我已经通过我在session.addIdentity()方法中使用的keygen从这个文件创建了私钥文件,私钥的格式是:

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

我错过了什么,请建议……

Interesting Posts