web-dev-qa-db-ja.com

netcatが応答を出力しない

netcatとパイプ応答を使用して、コマンドをTCPポートに送信しようとしています
netcatを実行してコマンドを入力すると、応答が正しく出力されますが、パイプからコマンドを渡すと、コマンドは正しく送信されますが応答が出力されません

したがって、これは正しく動作します:

netcat  localhost 9009

これはコマンドを送信するだけですが、応答を出力しません。

echo 'my_command' | netcat  localhost 9009

どうして?
どのようにしてnetcatに応答テキストを印刷させることができますか?

12
RYN

@Patrickが言ったように、この問題は通常、応答が与えられる前にnetcatが終了することが原因です。コマンドラインに-q 2を追加することで修正できます。つまり、標準入力でEOFを検出してから2秒程度ハングするようにnetcatに指示します。明らかに、他の秒数も待ちます。

8

これを使って:

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は自由に編集/削除できます。

1
yannick1976

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を追加すると機能します。

1
Peter