使用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-----
我错过了什么,请建议……