stdinの終了時にnetcatが終了しない


11

からメッセージを送信しようとしていますnetcat。メッセージを送信した後、netcat終了する必要があります。

私は以下を試しました:

cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin

-qオプションの状態:

-q秒

stdinのEOFの後、指定された秒数だけ待機してから終了します。秒が負の場合、永久に待機します。

だが

nc -q0 -u localhost 4300 < message.bin

また動作しません。

何が欠けていますか?

回答:


6

EOF接続の送信後にアイドル状態が続くと仮定すると、ゼロに等しく-w timeout機能するオプションを使用できtimeoutます(愚かな-qオプションとは異なり...)

cat tsmmessage.bin | nc -u localhost 4300 -w0

1
これは正解で、ではなく受け入れられたものでなければなりません-q
ccpizza

1
ゼロタイムアウトは私のマシンでは機能しません(debianストレッチ)。それは言うinvalid wait-time 0
アヌビス

3

-qフラグがないと、のインスタンスはnetcat永久に待機します。UDPには「ストリームの終わり」メッセージがないためnetcatstdinとネットワーク接続の両方が終了したことを知る方法はありません。

たとえば、TCP / IPを使用すると、これは期待どおりに機能します。

nc -l localhost 4300                     # Window 1
nc localhost 4300 </etc/group            # Window 2

しかし、あなたが決定したように、UDP / IPを使用すると、これは決して終わりません:

nc -u -l localhost 4300                  # Window 1
nc -u localhost 4300 </etc/group         # Window 2

これが-qフラグの出番です。しかし、残念ながらそれはの値を受け入れません0。また、整数以外の値も受け入れません。ここに私が頼ることなく、timeoutまたは他のいくつかの外部ユーティリティなしで提供できる最良の選択肢があります:

nc -u -l localhost 4300                  # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

ここでも、netcat優雅にリスニングタイムアウトを行うことはできません。(-wタイムアウトオプションは無視され、-q無関係です。)このようなものは実際の状況で役立つ場合があるため、netcat90秒後にが強制終了されます。

timeout 90 nc -u -l localhost 4300       # Window 1
nc -q 1 -u localhost 4300 </etc/group    # Window 2

-q 0私のために働く。
AlikElzin-kilaka

@ AlikElzin-kilakaは私にはうまくいきません。テストで間違いなくUDPを使用していますか?どのバージョンのnetcatをお持ちですか?おそらくより新しいバージョンを使用しています。
roaima 2018

0

udp

# listen on receiver
nc -u -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -u -N -q 0 localhost 4300

TCP

# listen on receiver
nc -l localhost -p 4300

# sender
cat tsmmessage.bin | nc -N localhost 4300

なぜ反対票?-Nオプションはこの問題を解決します
camelccc

-1

ほぼ同じ問題に関してグーグルでこれを偶然見つけました。問題は、すべてのデータが吸い込まれた直後にnetcatがbashによって殺され、応答を受け取る機会を得られなかったことでした。

これに対する私の解決策は、次のように、データをパイプした後に遅延を追加することでした:

(echo INFO; sleep 1) | nc redis.service.consul 6379

ファイルを使用すると、次のようになります。

(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300

netcatsleep終了してもまだ閉じません。最初のコマンドラインは1秒後にプロンプ​​トに戻ると思いますが、そうではありません。
フランクKusters 16年

追加は-q 1どうですか?すなわち(echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379
SkyWriter、2016年

-qすべての作品は、私の元の質問でも、例。それ以来、私はUbuntuの新しいバージョンに移行しました。おそらくそれが違いを引き起こしています。
Frank Kusters、2016年

それは変だ。とにかく、私たち2人がこれを回避する方法を見つけたことをうれしく思います:)
SkyWriter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.