web-dev-qa-db-ja.com

netcat:エコーサービスにテキストを送信し、返信を読んでから終了します

netcatを使用してサーバー上のエコーサービスにテキストを送信し、応答を取得して終了したいので、接続はまだ良好です。これまでに試しました:

 echo 'test' | netcat server 7 

このようにして、netcatは終了するのではなく、より多くの入力を待ちます。

エコーサービスから応答を得た後、どのようにnetcatを終了させることができますか?

8
David Dai

試したところ-netcat-openbsdnetcat-traditionalの間で少し異なる動作(ubuntu 16.4)。 OpenBSDバリアントは期待どおりの動作をしますが、netcat-traditionalでは、さらに入力を待つのを避けるために-q 1を追加する必要があります。

echo 'test' | netcat -q 1 server 7
5
jhilmer

これを使って:

cat <(echo command) - | nc Host port

問題は、stdinが閉じられた直後にncが接続を閉じることです。これは、単純なmy_command文字列の場合は非常に高速であるため、応答を受信する機会がありません。非常に大きなファイルをパイプ処理すると、ファイルの送信が完了する前に応答が返される場合があります。

2番目の引数としてcat-と入力します。これにより、catは、最初の引数の内容を送信した後、__ $$] _がstdinをリッスンして、より多くのコンテンツをパイプスルーします。最初の引数は、echoコマンドからcatを取得するだけです。これは、コマンドを含むファイルcat < file - | ...にすることもできます。

その欠点は、シェルで^Cまたは^Dを押すまで開いたままになることです。 -w 1(OSX netcat)または-i 1(nmapのncat)を使用してタイムアウトを追加すると、1秒後に接続が閉じられますが、文字を入力するまでプロセスは終了しません。

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

コマンドが機能するはずです。 netcatマンページの例の一部と非常に似ています。

これがnetcatの動作方法とまったく同じです。標準入力でEOFに到達すると、(一方向)サーバーへの接続を閉じ、/を待機します。サーバーからのデータ。後者が接続を閉じると(逆の方法:server-> client)、netcatが停止します。

netcatコマンドが完了しない場合、echoサーバーが追加入力をリッスンし続けるネットワークレベルで何か奇妙なことが起こっていると思います。

-qオプションを試して、EOFがstdinで検出されてからN秒後に停止するようにnetcatを強制することができます。

netcat -q1 server echo <<< "test"

<<< "test"bashismです。bashを使用しない場合はecho ... |構文を使用してください)

5
xhienne

あなたの質問が正しく理解できませんか?

デフォルトのnetcatリスナーは、入力を受信すると終了します(この場合、エコーはそれをnetcatにパイプし、それをリスナーに転送します)。

入力を受け取った後もリッスンするNetcatサービスがリッスンし続けるようにするには、次のようにします。

nc -lk 12345
  • ここで、12345はポート番号です

ただし、最も重要なことは、netcatのmanページを確認してください。これらはすべてのコマンドに驚くほど役立ちます...

man nc
2
Azeem Ilyas

私はこれが少し古いことを知っていますが、他の答えは私にとってうまくいきませんでした、そしてこれはうまくいきました:

echo 'test' | netcat -N $server $port

-N

入力のEOFの後にネットワークソケットをシャットダウンします。一部のサーバーは、作業を完了するためにこれを必要とします。

WindowsとLinuxの両方で私のために働いた。

1
yannick1976

代わりにsocatをお勧めします:

_echo test | socat -t 10 - tcp:server:7
_

(ここでは、サーバーが応答してシャットダウンするまで最大10秒待機しています)

socatは、nc/netcatのさまざまな(異なる、互換性のない)実装よりもはるかに多くのことを実行でき、一般的にはより確実に機能します。それはあなたの究極の配管スイスアーミーナイフです。

_-t_オプションのmanページを引用:

-t <タイムアウト>
一方のチャネルがEOFに達すると、もう一方のチャネルの書き込み部分がシャットダウンされます。その後、socatは[timeval]秒待機してから終了します。デフォルトは0.5秒です。このタイムアウトは、書き込み部分と読み取り部分を個別に閉じることができるアドレスにのみ適用されます。タイムアウト間隔中に読み取り部分がEOFを与えると、socatはタイムアウトを待たずに終了します。

したがって、上記では、echoが_test\n_を書き込んだ後、終了してパイプを閉じます。 socat sees EOF on its _-_ channel(stdin)then then the writing direction of the TCP socket and waits forリモートサービスもシャットダウンするか、非アクティブ状態が10秒間続くかのいずれか早い方。echoサービスは、もう一方の端が送信方向をシャットダウンするとすぐに接続を終了するため、コマンドは接続の確立、データの交換、シャットダウンにかかる時間よりも長い時間。

OpenBSDのnetcatまたはLinuxへの移植は、最近のバージョンのDebianとその派生物の少なくとも1つであり、近似値は_nc -Nw10 server 7_です(ncの_-w_は、接続タイムアウトと非アクティブタイムアウトの両方です)

テスト用にポート7777にTCP echoサービスを実装するには:

_socat tcp-listen:7777,reuseaddr,fork exec:cat,nofork
_

forkは着信接続ごとにプロセスをフォークし、noforkはそのプロセスでstdin/stdoutを使用してcatを直接実行しますbeing = = TCPソケット、_(x)inetd_を使用する場合と同様)。

zshを使用したループバックインターフェイスのタイミング:

_$ time echo test | socat -t10 - tcp:localhost:7777
test
echo test  0.00s user 0.00s system 54% cpu 0.001 total
socat -t10 - tcp:localhost:7777  0.00s user 0.01s system 55% cpu 0.009 total
_
0

以下のように、timeoutコマンドを試しながらncコマンドを確認するだけです。

echo "test" | timeout 10 netcat server 7

これは、接続を閉じる前に10秒待機します。

0
Alexandre

redisにpingを送信し、PONGをgrepします。

echo 'PING' | nc -w 1 server 6379 | grep PONG

Ansibleコマンドとして機能します。

0
OlliO

実際、接続を正常に閉じるための最良の方法は、Content-Lengthヘッダーは次のようになります。クライアント(curlなど)は、データの受信後に接続を閉じます。

DATA="Date: $(date)"; 
LENGTH=$(echo $DATA | wc -c);
echo -e "HTTP/1.1 200 OK\nContent-Length: ${LENGTH}\n\n${DATA}" | nc -l -p 8000;
0
user1067920