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

2022-09-03 13:52:12

当使用 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

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


答案 1

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

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

该原因可以通过禁用来自 sshd 的 DNS 查找来解决,方法是将

UseDNS no

在您的sshd_config中(通常)。根据Gilles在此线程中所写的内容,这通常是安全的。/etc/ssh/sshd_config

另一种选择是在连接通道时增加超时。 接受超时参数(毫秒),例如 .如果您不控制要连接到的服务器,这可能很有用。Channel.connectchannel.connect(60000)


答案 2

推荐