1

リモート シェル コマンドを実行する必要があるソフトウェアの一部を作成しています。このコマンドは、実行を継続するためにstdinからの追加情報を待ちます。

リモート プログラムtest_interactive.shは次のとおりです。

#!/bin/sh

echo -n "Please, enter a string: "

read string         # <-- Wait here for the input to come...
if [ -z "$string" ] ; then
    echo "1. You entered empty string." 1>&2
else
    echo "1. Your string: $string"
fi

この時点で、SSH_MSG_CHANNEL_REQUEST exec メッセージでコマンドの実行を開始しています。次に、ウィンドウの調整と成功メッセージの後、 sshdサーバーによってプログラムのstdinにプッシュされるデータと共にSSH_MSG_CHANNEL_DATAを送信しています。結局のところ、私のプログラムはstdinで何も受け取りません。

SSH_MSG_CHANNEL_REQUEST exec により、sshdプロセスが 2 つの追加プロセスsshd ( 63023 ) とtest_interactive ( 63024) を生成します。 ここに画像の説明を入力

プロセスtest_interactive* ( 63024 ) には、次のファイル記述子があります。 ここに画像の説明を入力

そして、メッセージを送信し、プログラムから何も返されない状態に導くメッセージのシーケンスは次のとおりです。

Send:    'SSH_MSG_CHANNEL_OPEN session'
Receive: 'SSH_MSG_CHANNEL_OPEN_CONFIRMATION 0'
Send:    'SSH_MSG_CHANNEL_REQUEST exec'
Receive: 'SSH_MSG_CHANNEL_WINDOW_ADJUST'
Receive: 'SSH_MSG_CHANNEL_SUCCESS'
Receive: 'SSH_MSG_CHANNEL_DATA Please, enter a string:'
Send:    'SSH_MSG_CHANNEL_DATA hello'  <-- communication stops here

SSH_MSG_CHANNEL_DATAで受信したデータを stdin にプッシュするように sshd に指示するにはどうすればよいですか? 私はsshdのソースコードを見てそれを見つけようとしましたが、それはかなり大きく、これを理解するには数週間かかると思います:)

最終的にそれを行う要求の組み合わせ

次の場合、デーモンsshdはデータをstdinにプッシュします。

  1. 「 SSH_MSG_CHANNEL_REQUEST exec 」の直後に「SSH_MSG_CHANNEL_DATA Hello World」を送信します
  2. 「 SSH_MSG_CHANNEL_DATA Hello World 」の直後に「SSH_MSG_CHANNEL_EOF」を送信します

またはより具体的に:

Send:    'SSH_MSG_CHANNEL_REQUEST exec'
Send:    'SSH_MSG_CHANNEL_DATA Hello World'
Send:    'SSH_MSG_CHANNEL_EOF'
Receive: 'SSH_MSG_CHANNEL_DATA Please, enter a string:'
Receive: 'SSH_MSG_CHANNEL_REQUEST exit-status'
Receive: 'SSH_MSG_CHANNEL_DATA Please, enter a string: 1. Your string: Hello\n'
Receive: 'SSH_MSG_CHANNEL_EOF'
Receive: 'SSH_MSG_CHANNEL_CLOSE'
Send:    'SSH_MSG_CHANNEL_CLOSE'
Send:    'SSH_MSG_DISCONNECT'

これで問題が解決するわけではありませんが、 sshdの動作についてもう少し詳しい情報が得られます。発火して忘れるだけでなく、自分に起こったことに基づいて、プログラムのメッセージを形成できる必要があります。

ちなみに、rfc4254タグを付けるとカッコいいですよ ;) ↓

4

1 に答える 1

1

ケンスターの助けを借りて、私は答えを見つけました.

はい、sshdは「SSH_MSG_CHANNEL_REQUEST exec」の後にデータをstdinに送信します。

ただし、送信する内容には注意が必要です。私の場合、応答メッセージを形成するメソッドによって、ストリームから「\n」文字が削除されました。この文字は、シェル関数の読み取りを続行するために必要でした。

于 2015-02-18T16:02:49.740 に答える