netcat
パイプレスポンスを使用してTCPポートにコマンドを送信しようとしています。コマンドを
実行しnetcat
て入力すると応答は正しく印刷されますが、パイプからコマンドを渡すとコマンドは正しく送信されますが、応答は印刷されません。
したがって、これは正しく機能します。
netcat localhost 9009
これはコマンドを送信するだけで応答を印刷しません。
echo 'my_command' | netcat localhost 9009
なぜ?応答テキストを
どのように印刷できますか?netcat
ベストアンサー1
これを使用してください:
cat <(echo command) - | nc host port
問題はnc
stdinが閉じるとすぐに接続が閉じられるということですが、これは単純なmy_command
文字列の場合は非常に高速なので応答を受ける機会がまったくありません。 (非常に大きなファイルをパイプすると、ファイル転送が完了する前に応答を受け取ることができます。)
2番目のcat
引数入力-
:cat
最初の引数の内容を送信した後、より多くの内容のために標準入力を受け取ります。最初のパラメータはecho
コマンドが実行されるようにしますcat
。 laコマンドを含むファイルでもかまいませんcat < file - | ...
。
またはこれを行う:
(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port
#
入力の2行目に無限の文字を送信します。#
Bashなどのリモートデバイスを使用する場合、このコメントは無視されます。ここでは、接続側でより速く反応するように、10ミリ秒という短い待ち時間を選択しました。 YMMV。
これの欠点は、シェルにぶつかるかヒットするまでcat
ループがwhile
実行され続けることです。実際にはリモート側によって異なります。nc
^C
^D
-w 1
(OSX netcat)または(nmapの場合はncat)を使用してタイムアウトを追加すると、1秒後に接続が閉じますが、一部の文字を入力して-i 1
パイプが切断されるまで実行されます。nc
cat
ただし、コマンドを受信して処理した後、リモート側が自動的に接続を閉じると機能します。これにより、nc
クライアントとクライアントに入るプロセスパイプも終了します。
この回答は以下に基づいています。これは同じスーパーユーザーの質問に対する答えです。。