2015-11-24 41 views
7

jschバージョン0.1.51を使用してリモートホストに接続すると、でChannel.connect()を呼び出すときに次の例外が発生することがあります。com.jcraft.jsch.JSchException: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) 

セッションが作成された後、我々が使用するコードは次のとおりです。

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

Channel.connect()コールは、通常は100ミリ秒未満で返しますが、このエラーはocurrsたときに呼び出しが前に20秒以上ハング例外をスローします。

答えて

12

例外メッセージは少し誤解を招くことがあります。このエラーは、サーバーからのSSH_MSG_CHANNEL_OPEN_CONFIRMATIONメッセージの待機中にタイムアウトが発生した場合に発生します。 jsch(バージョン0.1.51)のデフォルトのタイムアウトは20秒です。私は同じエラーが発生する他の状況があると思うが、私はそれ以上調べなかった。

タイムアウトの理由は多分あるかもしれませんが、OpenSSHのsshdの逆DNSルックアップが原因で、時折時間がかかることがありました。原因

(通常/etc/ssh/sshd_config)あなたのsshd_configに

UseDNS no 

を設定することで、SSHDからのDNSルックアップを無効にすることで解決することができます。これは一般的にはギルthisスレッドで書き込みすることによると安全です。

もう1つの方法は、チャネルを接続するときにタイムアウトを増やすことです。 Channel.connectはタイムアウト引数(ミリ秒)を受け取ります。 channel.connect(60000)。これは、接続先のサーバーを制御しない場合に便利です。

関連する問題