2014-09-03 323 views
-1

我有下面的代碼,SFTP,才能SFTP錯誤:com.jcraft.jsch.JSchException:無效的服務器的版本字符串

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位置,而不是從其他環境?

+0

的連接您的問題在於你要連接的ssh服務器。首先它發送了Jsch不喜歡的服務器版本,現在它正在關閉客戶端所建立的TCP連接。服務器上運行什麼操作系統?它運行什麼SSH服務器軟件?這個服務器軟件是什麼版本? – Kenster 2014-09-03 15:40:49

+0

您是否能夠在無法從「不同環境」連接的同時從本地機器進行連接? 「不同的環境」究竟意味着什麼?不同的位置?包含一些日誌文件,例如使用任何GUI SFTP客戶端。服務器的日誌也會有所幫助,至少可以看到來自「不同環境」的連接嘗試是否到達服務器。 – 2014-09-04 06:13:04

回答

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年9月3日17:01:20.596服務器版本:SSH-2.0-OpenSSH_5.3

(我的WinSCP的作者)

雖然可能它不是關於版本字符串在所有。我寧願相信新版本提出的錯誤,連接重置。舊版本可能無法檢測到連接過早中止,並嘗試驗證一些隨機或不完整的數據。

連接重置可能指示多種不同的錯誤

  • 服務器拒絕來自其他位置
  • 一些防火牆或代理服務器不允許連接通過
相關問題