2

次のライブラリJSCH、Apacheのsshd、およびsshjを使用して、SSHでいくつかの問題に遭遇しました。exec channel私が実行したコマンドからの出力を読み込もうとすると、それらはすべてブロックされ、最終的にタイムアウトになります。問題は、これは OpenSSH 4.5 サーバーがインストールされている一部のルーターでのみ発生することです。クライアントは、可能性のある最新バージョンの OpenSSH をインストールした仮想ボックスで完全に動作します。

Apache MINA SSHD を使用すると、クライアントは次のようになります。

public static void main(String[] args) throws InterruptedException, IOException {
    String cmdToRun = "ls";
    SshClient client = SshClient.setUpDefaultClient();
    client.start();
    ClientSession session = client.connect("127.0.0.1", 22).await().getSession();
    session.authPassword("sshUser", "sshPass").await().isSuccess();
    ChannelExec channelExec = session.createExecChannel(cmdToRun);
    channelExec.setOut(System.out);        
    channelExec.open();
    channelExec.waitFor(ClientChannel.CLOSED, 0);
    channelExec.close(true);
    client.stop();
}

私は Eclipse でデバッグしており、WireShark を使用して、送信されたメッセージと受信されたメッセージを観察していますが、すべて問題ないようです。DH交換はうまくいきますが、authもうまくいきますが、仮想ボックス(動作する場所)でexecチャネルを開こうとすると、次のようになります:

.....
.....
受信 SSH_MSG_USERAUTH_SUCCESS
チャネル 101 で SSH_MSG_CHANNEL_OPEN を送信

サーバーから受け取る応答は次のようになります。

5b 00 00 00 65 00 00 00 00 00 00 00 00 00 00 80 00
5b は、SSH_MSG_CHANNEL_OPEN_CONFIRMATION
00 00 00 65 はクライアントが送信したチャネルです (もちろん 101)
00 00 00 00 は、サーバーが割り当てたチャネルです
00 00 00は初期ウィンドウ サイズです
。00 00 80 00 は最大パケット サイズです。

初期ウィンドウ サイズは 0 であるため、最初にSSH_MSG_CHANNEL_WINDOW_ADJUSTメッセージを受け取り、次に を受け取りますSSH_MSG_CHANNEL_SUCCESS。これは、要求 (コマンド) が正常に実行されたことを意味します。SSH_MSG_CHANNEL_REQUESTを含むexit-status 0とコマンドのSSH_MSG_CHANNEL_DATA結果を含む は、ls後で期待どおりに交換されます。

OpenSSH 4.5 を搭載したルーターでは、5b メッセージが少し異なって見えます。

5b 00 00 00 65 00 00 00 00 00 02 00 00 00 00 80 00

ご覧のとおり、初期ウィンドウが設定されているため、 を受け取る必要はありませんSSH_MSG_CHANNEL_WINDOW_ADJUST。私は を受け取りSSH_MSG_CHANNEL_SUCCESS、それだけで停止します。前の例に示すように、SSH_MSG_CHANNEL_REQUESTコマンドの終了ステータスを含むもの、または を受け取りません。SSH_MSG_CHANNEL_DATAWiresharkはそれを確認します。

なぜこうなった?SSH_MSG_CHANNEL_SUCCESSリクエストが成功したことを確認するを受け取ったのに、どうして結果を受け取れないのですか?

これは、私が使用するすべての異なるクライアント ライブラリで発生し、どういうわけかタイムアウトします。チャネルを開けば問題なく動作shellしますが、インタラクティブ セッションは使用したくありません。各行を読む必要があるページが多いコマンドについては、続行するために何かを押す必要があるかどうかなどを確認してください。

私はあきらめるべきですか?execたぶん、OpenSSH 4.5 はチャネルを許可していませんか? エラーが出ないのはなぜですか?

4

1 に答える 1

2

どうやら、サーバーの SSH 設定が原因で、応答やエラーが発生しません。

それが誰かを助ける場合: クライアントとサーバー間の ssh メッセージ交換をデバッグして、セッションキーをキャプチャして ssh を復号化することなく、交換内容を正確に確認したい場合は、受信したバッファーを確認できます: ClientSessionImpl :doHandleMessage(Buffer) Apache Mina SSH クライアント用。ああ、これはサーバーから受け取るものを確認するためのものです。送信するものが簡単であることを確認するには、コードで使用するメソッドを見てください。

于 2013-10-16T10:17:57.630 に答える