netcatは応答を印刷しません

netcatは応答を印刷しません

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

したがって、これは正しく機能します。

netcat  localhost 9009

これはコマンドを送信するだけで応答を印刷しません。

echo 'my_command' | netcat  localhost 9009

なぜ?応答テキストを
どのように印刷できますか?netcat

答え1

これを使用してください:

cat <(echo command) - | nc host port

問題はncstdinが閉じるとすぐに接続が閉じられるということですが、これは単純な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パイプが切断されるまで実行されます。nccat

ただし、コマンドを受信して​​処理した後、リモート側が自動的に接続を閉じると機能します。これにより、ncクライアントとクライアントに入るプロセスパイプも終了します。

この回答は以下に基づいています。これは同じスーパーユーザーの質問に対する答えです。

答え2

@Patrickが言ったように、この問題は通常、netcat応答が提供される前にシャットダウンしたために発生します。標準入力でEOFを検出してから約2秒間停止するように指示-q 2するコマンドラインを追加すると、この問題を解決できます。netcat明らかに別の秒間待つこともできます。

答え3

他の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を追加して使用できます。

答え4

私はnmapでncatを使用しています。

Ncat: Version 7.80 ( https://nmap.org/ncat )

--no-shutdownオプションはこの問題を解決します。

echo 'test' | netcat --no-shutdown $server $port

関連情報