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)
. Это может быть полезно, если вы не контролируете сервер подключаемся.