com.jcraft.jsch.JSchException:在jsch中打开通道时未打开通道

时间:2015-11-24 13:55:05

标签: java jsch

使用jsch版本0.1.51连接到远程主机时,我们在Channel.connect()上调用ChannelExec时偶尔会遇到以下异常。

com.jcraft.jsch.JSchException: channel is not opened.
    at com.jcraft.jsch.Channel.sendChannelOpen(Channel.java:765)
    at com.jcraft.jsch.Channel.connect(Channel.java:151)
    at com.jcraft.jsch.Channel.connect(Channel.java:145)

我们在创建会话后使用的代码是:

ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand("echo hello");
channel.connect(); // Error here

Channel.connect()调用通常会在100毫秒内返回,但是当此错误发生时,调用会在抛出异常之前挂起超过20秒。

1 个答案:

答案 0 :(得分:12)

异常消息有点误导。当等待来自服务器的SSH_MSG_CHANNEL_OPEN_CONFIRMATION消息超时时,可能会发生此错误。 jsch(版本0.1.51)中的默认超时为20秒。我认为还有其他情况会发生同样的错误,但我没有进一步调查。

虽然可能有多种原因导致超时,但我们已经看到它是由OpenSSH的sshd中的反向DNS查找引起的,偶尔需要很长时间。

可以通过设置

从sshd禁用DNS查找来解决该原因
UseDNS no
你的sshd_config中的

(通常是/etc/ssh/sshd_config)。根据 Gilles this帖子中写的内容,这通常是安全的。

另一种选择是在连接频道时增加超时。 Channel.connect接受超时参数(毫秒),例如channel.connect(60000)。如果您不控制要连接的服务器,这将非常有用。