リモート シェル コマンドを実行する必要があるソフトウェアの一部を作成しています。このコマンドは、実行を継続するために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にプッシュします。
- 「 SSH_MSG_CHANNEL_REQUEST exec 」の直後に「SSH_MSG_CHANNEL_DATA Hello World」を送信します
- 「 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タグを付けるとカッコいいですよ ;) ↓