作者:looloSam | 来源:互联网 | 2023-08-30 11:13
我正面临着通过JSch创建到远程SFTP服务器的会话的问题:
我用来通过shell连接sftp服务器的命令是:
sftp -o BindAddress=SOME_IP_ADDRRESS myUserName@HOST_IP_ADDR
并且它工作正常,但是当我尝试使用Java(JSch)时,我得到一个超时异常. 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: socket is not established
我想它的到来因为我没有使用-o选项设置BindAddress,而我正在使用shell命令.如果是这种情况,那么如何在JSch中设置-o BindAddress参数?或者我做错了什么,请建议.
解决方法:
我不认为在JSch中选择要连接的网络接口有明确的支持.
但是您可以实现SocketFactory接口,例如使用constructor overload with the localAddr创建Socket实例:
public Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
(对localPort使用0)
然后在调用connect()之前将工厂传递给Session.setSocketFactory(),你应该很好.