2015-11-24 14 views
7

Beim Herstellen einer Verbindung zu einem Remote-Host mit der jsch-Version 0.1.51 tritt gelegentlich die folgende Ausnahme beim Aufruf von Channel.connect() auf einer auf.com.jcraft.jsch.JSchException: Kanal wird beim Öffnen eines Kanals in jsch nicht geöffnet

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) 

Der Code, den wir nach der Sitzung verwenden erstellt worden ist:

ChannelExec channel = (ChannelExec) session.openChannel("exec"); 
channel.setCommand("echo hello"); 
channel.connect(); // Error here 

Die in der Regel Channel.connect() Anruf unter 100 ms in zurückgibt, aber wenn dieser Fehler der Ruf hängt für mehr als 20 Sekunden ocurrs vor die Ausnahme werfen.

Antwort

12

Die Ausnahmebedingungsnachricht ist leicht irreführend. Der Fehler kann auftreten, wenn ein Timeout auf die Nachricht SSH_MSG_CHANNEL_OPEN_CONFIRMATION vom Server wartet. Das Standard-Timeout in JSCH (Version 0.1.51) beträgt 20 Sekunden. Ich denke, es gibt andere Situationen, in denen der gleiche Fehler auftritt, aber ich habe nicht weiter untersucht.

Während es wahrscheinlich zahlreiche Gründe für das Timeout geben kann, haben wir gesehen, dass es durch reverse DNS-Lookups in sshd von OpenSSH verursacht wurde, die gelegentlich lange Zeit in Anspruch nahmen.

Dass Ursache kann durch

UseDNS no 

in Ihrem sshd_config (typischerweise /etc/ssh/sshd_config) Einstellung durch das Deaktivieren DNS-Lookups von sshd aufgelöst werden. Dies ist in der Regel sicher zu tun, was Gilles schreibt in this Thread.

Eine andere Möglichkeit besteht darin, die Zeitüberschreitung beim Verbinden des Kanals zu erhöhen. akzeptiert ein Timeout-Argument (Millisekunden), z.B. channel.connect(60000). Dies kann nützlich sein, wenn Sie den Server nicht steuern, mit dem Sie eine Verbindung herstellen.

Verwandte Themen