SFTP错误:com.jcraft.jsch.JSchException:无效的服务器版本字符串

时间:2014-09-03 15:24:03

标签: session ssh version sftp jsch

我有以下代码到SFTP到一个位置

public static void putFile(String username, String host, String password, String remotefile,     String localfile){
    JSch jsch = new JSch();
    Session session = null;
    try {
          session = jsch.getSession(username, host, 22);
          session.setConfig("StrictHostKeyChecking", "no");
          session.setPassword(password);
          session.connect();

          Channel channel = session.openChannel("sftp");
          channel.connect();
          ChannelSftp sftpChannel = (ChannelSftp) channel;
          sftpChannel.put(localfile, remotefile);
          sftpChannel.exit();
          session.disconnect();
     } catch (JSchException e) {
          e.printStackTrace();  
     } catch (SftpException e) {
          e.printStackTrace();
     }
}

我可以使用上面的代码从我的本地机器SFTP文档。但是,当我尝试从不同的环境到SFTP到同一位置时,我收到了跟随错误。

  

com.jcraft.jsch.JSchException:无效服务器的版本字符串
  com.jcraft.jsch.Session.connect(Session.java:253)

注意:我使用的是 jsch-0.1.31.jar 文件。

关于打印session.getClientVersion()我正在“SSH-2.0-JSCH-0.1.31”

我尝试将jar文件升级为 jsch-0.1.51.jar 然后session.getClientVersion() = “SSH-1.5-JSCH-0.1.51”我收到以下错误

  

com.jcraft.jsch.JSchException:Session.connect:java.net.SocketException:连接重置,位于com.jcraft.jsch.Session.connect(Session.java:558)

请问您能帮助我了解我应该查看哪些参数以及是什么原因导致它从本地计算机运行并上传到相同的SFTP位置而不是其他环境?

1 个答案:

答案 0 :(得分:0)

如@Kenster所述,例外是关于服务器的版本字符串,而不是客户端。 "无效服务器的版本字符串" 异常由Session.connect中的以下代码抛出:

if(i==buf.buffer.length ||
   i<7 ||                                      // SSH-1.99 or SSH-2.0
   (buf.buffer[4]=='1' && buf.buffer[6]!='9')  // SSH-1.5
   ){
  throw new JSchException("invalid server's version string");
}

首先,我会尝试连接一些记录版本字符串并看到自己的客户端。例如,使用WinSCP,在其日志中搜索如下模式:

  

。 2014-09-03 17:01:20.596服务器版本:SSH-2.0-OpenSSH_5.3

(我是WinSCP的作者)

虽然可能它根本不是版本字符串。我宁愿相信新版本提出的错误,连接重置。旧版本可能无法检测到连接过早中止并尝试验证一些随机或不完整的数据。

连接重置可能表示各种不同的错误

  • 服务器拒绝来自其他位置的连接
  • 某些防火墙或代理不允许连接通过