2015-11-24 22 views
7

Quando ci si collega a un host remoto utilizzando jsch versione 0.1.51 occasionalmente si verifica la seguente eccezione quando si chiama Channel.connect() su un .com.jcraft.jsch.JSchException: il canale non viene aperto all'apertura di un canale in jsch

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) 

Il codice che utilizziamo dopo la sessione è stato creato è:

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

La chiamata Channel.connect() solito ritorna in meno di 100 ms, ma quando questo errore ocurrs la chiamata si blocca per più di 20 secondi prima di gettando l'eccezione.

risposta

12

Il messaggio di eccezione è leggermente fuorviante. L'errore può verificarsi quando c'è un timeout in attesa del messaggio SSH_MSG_CHANNEL_OPEN_CONFIRMATION dal server. Il timeout predefinito in jsch (versione 0.1.51) è di 20 secondi. Penso che ci siano altre situazioni in cui si verifica lo stesso errore ma non ho indagato ulteriormente.

Mentre ci possono essere numerosi motivi per il timeout, l'abbiamo visto causato da ricerche DNS inverse in sshd da OpenSSH che richiedevano molto tempo.

Ciò causa può essere risolto disattivando ricerche DNS da sshd impostando

UseDNS no 

nel vostro sshd_config (tipicamente /etc/ssh/sshd_config). Questo è generalmente sicuro da fare secondo quanto scrive Gilles nel thread this.

Un'altra opzione è aumentare il timeout durante il collegamento del canale. Channel.connect accetta un argomento di timeout (millisecondi), ad es. channel.connect(60000). Questo può essere utile se non controlli il server a cui ti stai connettendo.