2016-09-22 36 views
0

問題:使用JSCH庫通過SFTP連接遠程站點會導致「通道未打開」。代碼從一個互聯網連接正常工作,但從另一個失敗。另一個是通過代理完成的。不過,我可以使用FileZilla客戶端通過另一臺SFTP進行連接。JSCH通道未打開(新)

研究:試圖增加連接timout和設置useDNS:假從類似的問題。我有會議和頻道選擇它。但是,在timout之後,通道連接失敗。

問題:如何獲得連接。

下面是代碼和錯誤堆棧跟蹤提取物:

JSch jsch = new JSch(); 
    UserInfo userInfo ; 

    jsch.setKnownHosts(KNOWN_HOSTS); 

    session = jsch.getSession(
    Menue.SITE_LOGIN, 
    Menue.SITE_HOST, 
    Menue.SITE_PORT); 

    session.setPassword(
    Menue.SITE_PASSWORD); 

    if (Menue.USE_PROXY) { 
    session.setProxy(
     new ProxyHTTP(
     Menue.PROXY_HOST, 
     Menue.PROXY_PORT)); 
    } 

    session.setConfig(
    "StrictHostKeyChecking", 
    "yes"); 

    session.connect(); 
    channel = session.openChannel("sftp"); 
    channel.setInputStream(System.in); 
    channel.setOutputStream(System.out); 
    channel.connect(60 * 1000); // Error: channel is not opened. 

堆棧跟蹤:

com.jcraft.jsch.JSchException:信道沒有被打開。在 com.jcraft.jsch.Channel.sendChannelOpen(Channel.java:765)在 com.jcraft.jsch.Channel.connect(Channel.java:151)

+0

[Channel.java 765線(HTTP:/ /grepcode.com/file/repo1.maven.org/mav en2/com.jcraft/jsch/0.1.51/com/jcraft/jsch/Channel.java?av = f#765)意味着它失敗了,因爲你的5秒超時太短。對此的修復似乎很明顯。你說你已經嘗試了增加超時時間,並以其他方式失敗。但是我們只能幫助你解決你在問題中出現的問題。 – Kenster

+0

更改爲60秒。結果相同。它工作正常,沒有任何超時從另一個辦公室。 – Zon

+0

您可以在60秒內調查服務器上正在發生的事情嗎?例如,如果服務器是OpenSSH,它應該啓動[sftp-server](http://man.openbsd.org/sftp-server)程序的一個實例來處理sftp通道請求。另外,ssh服務器可以設置爲以不同的方式處理特定的連接。或者用戶的.bashrc或服務器上的類似文件可能會干擾啓動sftp-server程序。 – Kenster

回答

0

上的錯誤的輸出是無信息(以及圖書館的稀缺文獻)。原因是在連接上管理服務器rsa-keys。我想沒有用戶對話框和全自動(UserInfo禁用)。

StrickedHostKeyChecking應該是沒有,雖然它是不安全的。將其設置爲「no」允許將本地密鑰庫自動加入rsa密鑰(例如〜/ .ssh/known_hosts)。

最後導致了代碼:

try { 
    JSch jsch = new JSch(); 

    jsch.setKnownHosts("~/.ssh/known_hosts"); 

    Session session = jsch.getSession(
    "my_login", 
    "my.host", 
    22); 

    session.setPassword(
    "password"); 

    // Autoadd system rsa-keys to system file like known_hosts by 
    // disabling strick keys checking: 
    java.util.Properties config = new java.util.Properties(); 
    config.put(
    "StrictHostKeyChecking", 
    "no"); 
    session.setConfig(config); 

    session.connect(); 

    Channel channel = session.openChannel("sftp"); 
    channel.connect(); 
    ChannelSftp sftpChannel = (ChannelSftp) channel; 

    System.out.println(
     sftpChannel.ls("/")); 

    session.disconnect(); 
} catch (Exception e) { 
    System.out.println(e); 
} 

這些文章幫助:

Original example on KnownHosts

Adding rsa to known_hosts

Unknown hostkey management