当使用jsch版本0.1.51连接到远程主机时,我们在调用Channel.connect()a 时偶尔会遇到以下异常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)
Run Code Online (Sandbox Code Playgroud)
我们在创建会话后使用的代码是:
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand("echo hello");
channel.connect(); // Error here
Run Code Online (Sandbox Code Playgroud)
该Channel.connect()调用通常在100毫秒内返回,但是当出现此错误时,调用会在抛出异常之前挂起超过20秒.
K E*_*son 12
异常消息有点误导.当等待SSH_MSG_CHANNEL_OPEN_CONFIRMATION来自服务器的消息超时时,可能会发生此错误.jsch(版本0.1.51)中的默认超时为20秒.我认为还有其他情况会发生相同的错误,但我没有进一步调查.
虽然可能有很多原因导致超时,但我们已经看到它是由OpenSSH的sshd中的反向DNS查找引起的,偶尔需要很长时间.
可以通过设置从sshd禁用DNS查找来解决该原因
UseDNS no
Run Code Online (Sandbox Code Playgroud)
在你的sshd_config中(通常/etc/ssh/sshd_config).根据Gilles在这个帖子中所写的内容,这通常是安全的.
另一种选择是在连接通道时增加超时.Channel.connect接受超时参数(毫秒),例如channel.connect(60000).如果您不控制要连接的服务器,这将非常有用.