【问题标题】:SFTP error : com.jcraft.jsch.JSchException: invalid server's version stringSFTP 错误:com.jcraft.jsch.JSchException:服务器的版本字符串无效
【发布时间】:2017-02-24 15:00:13
【问题描述】:

我有下面的代码来 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: 服务器的版本字符串无效 at
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: Connection reset at com.jcraft.jsch.Session.connect(Session.java:558)

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

【问题讨论】:

  • 您的问题出在您要连接的 ssh 服务器上。首先它发送了一个 Jsch 不喜欢的服务器版本,现在它正在关闭您的客户端建立的 TCP 连接。服务器上正在运行什么操作系统?它正在运行什么 SSH 服务器软件?这个服务器软件是什么版本的?
  • 在“不同环境”连接失败的同时,是否可以从本地机器连接? “不同的环境”究竟意味着什么?位置不同?包括一些日志文件,例如使用任何 GUI SFTP 客户端。服务器的日志也会有所帮助,至少可以查看来自“不同环境”的连接尝试是否完全到达服务器。

标签: session ssh version sftp jsch


【解决方案1】:

正如@Kenster 所指出的,例外是关于服务器的版本字符串,而不是客户端的。 "invalid server's version string"异常由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 的作者)

虽然可能根本与版本字符串无关。我宁愿相信新版本引发的错误,Connection reset。旧版本可能无法检测到连接被提前中止,并尝试验证一些随机或不完整的数据。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-01
    • 2014-03-16
    • 2019-08-02
    • 2018-02-14
    • 2021-09-18
    • 2017-11-06
    • 2016-11-11
    • 1970-01-01
    相关资源
    最近更新 更多