com.jcraft.jsch.JSchException: канал не открывается при открытии канала в 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 мс, но когда эта ошибка ocurrs вызов зависает более 20 секунд, прежде чем вызвать исключение.

1 ответов


сообщение об исключении немного вводит в заблуждение. Ошибка может возникнуть, когда есть тайм-аут, ожидающий SSH_MSG_CHANNEL_OPEN_CONFIRMATION сообщение от сервера. Тайм-аут по умолчанию в jsch (версия 0.1.51) составляет 20 секунд. Я думаю, что есть другие ситуации, когда происходит та же ошибка, но я не исследовал дальше.

хотя, вероятно, может быть множество причин для тайм-аута, мы видели, что это вызвано обратными DNS-поисками в sshd из OpenSSH, которые заняли много времени иногда.

эту причину можно устранить, отключив поиск DNS из sshd, установив

UseDNS no

в файле sshd_config (обычно /etc/ssh/sshd_config). Это вообще безопасно по Жиль пишет этой нить.

другой вариант-увеличить время ожидания при подключении канала. Channel.connect принимает аргумент timeout (миллисекунды), например channel.connect(60000). Это может быть полезно, если вы не контролируете сервер подключаемся.