2016-09-22 35 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