我通过sftp(JSCH)连接到FTP服务器。
Evertime我使用端口21连接到FTP服务器,它总是在session.connect()处挂起。
它不会抛出任何异常。但是当我使用其他端口时。它有效,它会抛出异常。
有什么方法可以捕捉错误吗?
以下是我的代码示例。
public static void main(String[] args) throws SftpException {
JSch jsch = new JSch();
try {
Session session = jsch.getSession("username", "host", 21);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("password");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp channelSftp = (ChannelSftp) channel;
session.disconnect();
channelSftp.disconnect();
} catch (JSchException e) {
log("Cannot make connection to FTP server ");
e.printStackTrace();
}
}
答案 0 :(得分:10)
我遇到了类似的问题,但是端口正确。 session.connect()只是挂起并且不返回任何内容。其他程序可以成功连接。
原因是主机提供了更多的身份验证方法,我们必须指出Jsch只使用密码。
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
config.put("PreferredAuthentications", "password");
session.setConfig(config);
答案 1 :(得分:6)
可能是端口22是SFTP的默认端口吗?并且在端口21上运行的FTP服务器将不知道如何协商对话以获得安全的FTP。基本上,SFTP是基于SSH的FTP。
EDITED:
问题是,它无限期地等待谈判完成。这是墨西哥的对峙,双方都没有放弃。在session.setTimeout()
之前拨打session.connect()
,或拨打session.connect(timeout)
,使用一些合适的值(3-5秒)。我相信超时是以毫秒为单位。
答案 2 :(得分:1)
我们正在JSch
服务器上运行webMethods
。
在我们尝试连接到我们的某个合作伙伴时升级到新版本后,它会挂起连接步骤。
此处提出的解决方案尚未奏效。我收到了这个错误:
com.jcraft.jsch.JSchException:Auth fail
我注意到我们尝试连接的服务器在连接完成之前要求输入用户和密码:
[sagtest@indigo sftpTest]$ /opt/sag/95/sitcore/jvm/jvm/bin/java -jar
SftpConnect.jar
Password has been set
Timeout has been set
Kerberos username [sagtest]:
Kerberos password for sagtest:
Connected
Channel opened
Connected
Session: iui-bpjobs01.itservices.lan:22:bp-xfer-int:1738666864
Kerberos
用户和密码根本不应该存在。
经过小规模调查,我发现此页面: Skipping Kerberos authentication prompts with JSch
将PreferredAuthentications
设置为其他值后 - 一切正常。我添加的代码:
session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
以下是我所拥有的完整示例 - 也许它可以帮助某人调试您的问题:
public static void main (String[] args){
String serverport = "22";
String serverhost = "XXXX";
String username = "YYYY";
String password = "ZZZZZ";
int timeout = 5000;
try{
int port = 22;
String sessionkey = null;
if(serverport != null && !serverport.trim().equals(""))
port = Integer.parseInt(serverport);
JSch jsch=new JSch();
Session session=jsch.getSession(username, serverhost, port);
jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts");
session.setPassword(password);
System.out.println("Password has been set");
if(timeout > 0){
session.setTimeout(timeout);
System.out.println("Timeout has been set");
}
session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
System.out.println("Added PreferredAuthentications");
session.connect();
System.out.println("Connected");
Channel channel = session.openChannel("sftp");
System.out.println("Channel opened");
channel.connect();
System.out.println("Connected");
if (channel.isConnected()){
sessionkey = serverhost + ":" + serverport + ":" + username + ":" + Thread.currentThread().hashCode();
}
System.out.println("Session: "+sessionkey);
}catch(Exception e){
e.printStackTrace();
}
}
答案 3 :(得分:0)
在我的情况下,只更新JSch到最新版本(目前是1.50)修复了这个问题,似乎与旧版本的JSch结合最新的OpenSSH版本7.1.x的密钥/ auth握手不兼容