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

Java com.jcraft.jsch.JSchException:在jsch中打开通道时未打开通道,java,jsch,Java,Jsch,当使用jsch版本0.1.51连接到远程主机时,在ChannelExec上调用Channel.connect()时,我们偶尔会遇到以下异常 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)

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

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秒以上。

异常消息有点误导。当等待服务器发出的
SSH\u MSG\u CHANNEL\u OPEN\u确认消息超时时,可能会发生此错误。jsch(版本0.1.51)中的默认超时为20秒。我认为在其他情况下也会发生同样的错误,但我没有进一步调查

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

该原因可以通过设置从sshd禁用DNS查找来解决

UseDNS no
在您的sshd_配置中(通常是
/etc/ssh/sshd_配置
)。根据Gilles在线程中写的内容,这样做通常是安全的

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