次のライブラリ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_DATA
Wiresharkはそれを確認します。
なぜこうなった?SSH_MSG_CHANNEL_SUCCESS
リクエストが成功したことを確認するを受け取ったのに、どうして結果を受け取れないのですか?
これは、私が使用するすべての異なるクライアント ライブラリで発生し、どういうわけかタイムアウトします。チャネルを開けば問題なく動作shell
しますが、インタラクティブ セッションは使用したくありません。各行を読む必要があるページが多いコマンドについては、続行するために何かを押す必要があるかどうかなどを確認してください。
私はあきらめるべきですか?exec
たぶん、OpenSSH 4.5 はチャネルを許可していませんか? エラーが出ないのはなぜですか?