web-dev-qa-db-ja.com

com.jcraft.jsch.JSchException:jschでチャネルを開くときにチャネルが開かない

Jschバージョン0.1.51を使用してリモートホストに接続する場合、ChannelExecChannel.connect()を呼び出すと、次の例外が発生することがあります。

_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ミリ秒未満で戻りますが、このエラーが発生すると、例外をスローする前に呼び出しが20秒以上ハングします。

11
K Erlandsson

例外メッセージは少し誤解を招くものです。エラーは、サーバーからの_SSH_MSG_CHANNEL_OPEN_CONFIRMATION_メッセージを待機するタイムアウトがある場合に発生する可能性があります。 jsch(バージョン0.1.51)のデフォルトのタイムアウトは20秒です。同じエラーが発生する状況は他にもあると思いますが、これ以上調査していません。

タイムアウトには多くの理由が考えられますが、OpenSSHからのsshdでのDNSの逆引きが原因で時折長い時間がかかることが原因であることがわかりました。

その原因は、sshdからのDNSルックアップを無効にすることで解決できます。

_UseDNS no
_

sshd_config(通常は_/etc/ssh/sshd_config_)内。これは一般に、Gillesthis スレッドに書き込む内容に従って安全に実行できます。

別のオプションは、チャネルに接続するときにタイムアウトを増やすことです。 _Channel.connect_は、タイムアウト引数(ミリ秒)を受け入れます。 channel.connect(60000)。これは、接続しているサーバーを制御していない場合に役立ちます。

12
K Erlandsson