netcat
とパイプ応答を使用して、コマンドをTCPポートに送信しようとしていますnetcat
を実行してコマンドを入力すると、応答が正しく出力されますが、パイプからコマンドを渡すと、コマンドは正しく送信されますが応答が出力されません
したがって、これは正しく動作します:
netcat localhost 9009
これはコマンドを送信するだけですが、応答を出力しません。
echo 'my_command' | netcat localhost 9009
どうして?
どのようにしてnetcat
に応答テキストを印刷させることができますか?
@Patrickが言ったように、この問題は通常、応答が与えられる前にnetcat
が終了することが原因です。コマンドラインに-q 2
を追加することで修正できます。つまり、標準入力でEOFを検出してから2秒程度ハングするようにnetcat
に指示します。明らかに、他の秒数も待ちます。
これを使って:
cat <(echo command) - | nc Host port
問題は、stdinが閉じられた直後にnc
が接続を閉じることです。これは、単純なmy_command
文字列の場合は非常に高速であるため、応答を受信する機会がありません。 (非常に大きなファイルをパイプ処理すると、ファイルの送信が完了する前に応答が返される場合があります)。
2番目の引数としてcat
と-
を入力します。これにより、最初の引数の内容を送信した後、cat
がstdinをリッスンして、パイプする追加のコンテンツを探します。最初の引数は、echo
コマンドをcat
で取得するだけです。これは、コマンドを含むファイル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)または-i 1
(nmapのncat)を使用してタイムアウトを追加すると、接続が閉じ、1秒後にnc
になりますが、cat
は、あなたはいくつかの文字を入力するとパイプが壊れます(私は思う)。
ただし、リモート側がコマンドを受信して処理した後に接続を自動的に閉じる場合は機能します。これにより、nc
クライアントとそれに接続するプロセスも終了します。
この回答はこれに基づいています 同じスーパーユーザーの質問に対するこの回答 。
私はこれが少し古いことを知っていますが、他の答えは私にとってうまくいきませんでした、そしてこれはうまくいきました:
echo 'test' | netcat -N $server $port
-N
:
入力のEOFの後にネットワークソケットをシャットダウンします。一部のサーバーは、作業を完了するためにこれを必要とします。
WindowsとLinuxの両方で私のために働いた。
注:これは、私が 重複した質問 に対して投稿した回答のコピーペーストです。
これは役に立つと思います。これがポリシーなどに反する場合、Modは自由に編集/削除できます。
Openbsd-netcatのバージョンが異なると、風変わりで、-w <seconds>
、-q <seconds>
、-N
のさまざまな組み合わせが必要になり、接続のもう一方の端で何が実行されているかに応じて異なる引数が必要になることもあります。特定のバージョンまたはサーバーでタイムアウトオプションを使用すると遅延が発生し、それらを使用しないと、非常に長い(無限?)遅延が発生する可能性があります。そして、私はgnu netcatで異なる癖を期待しますが、それらのバージョン間で異なるかどうかはわかりません。
たとえば、archlinuxのバージョン1.130_3でこれを実行すると、非常に長い時間がかかります(永久に?)。
$ echo response | nc -l 9999 &
[1] 15190
$ time echo request | nc localhost 9999
request
response
(wait forever possibly)
ただし、サーバーまたはクライアントに-Nを追加すると機能します。