netcat
を使用してサーバー上のエコーサービスにテキストを送信し、応答を取得して終了したいので、接続はまだ良好です。これまでに試しました:
echo 'test' | netcat server 7
このようにして、netcatは終了するのではなく、より多くの入力を待ちます。
エコーサービスから応答を得た後、どのようにnetcat
を終了させることができますか?
試したところ-netcat-openbsd
とnetcat-traditional
の間で少し異なる動作(ubuntu 16.4)。 OpenBSDバリアントは期待どおりの動作をしますが、netcat-traditionalでは、さらに入力を待つのを避けるために-q 1
を追加する必要があります。
echo 'test' | netcat -q 1 server 7
これを使って:
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"
はbash
ismです。bash
を使用しない場合はecho ... |
構文を使用してください)
あなたの質問が正しく理解できませんか?
デフォルトのnetcatリスナーは、入力を受信すると終了します(この場合、エコーはそれをnetcatにパイプし、それをリスナーに転送します)。
入力を受け取った後もリッスンするNetcatサービスがリッスンし続けるようにするには、次のようにします。
nc -lk 12345
ただし、最も重要なことは、netcatのmanページを確認してください。これらはすべてのコマンドに驚くほど役立ちます...
man nc
私はこれが少し古いことを知っていますが、他の答えは私にとってうまくいきませんでした、そしてこれはうまくいきました:
echo 'test' | netcat -N $server $port
-N
:
入力のEOFの後にネットワークソケットをシャットダウンします。一部のサーバーは、作業を完了するためにこれを必要とします。
WindowsとLinuxの両方で私のために働いた。
代わりに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
_
以下のように、timeout
コマンドを試しながらnc
コマンドを確認するだけです。
echo "test" | timeout 10 netcat server 7
これは、接続を閉じる前に10秒待機します。
redisにpingを送信し、PONGをgrepします。
echo 'PING' | nc -w 1 server 6379 | grep PONG
Ansibleコマンドとして機能します。
実際、接続を正常に閉じるための最良の方法は、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;