netcatでUDPパケットを1つだけ送信する方法は?


120

UDPパケットで短い値を1つだけ送信したいが、コマンドを実行したい

echo -n "hello" | nc -4u localhost 8000

サーバーがhello要素を取得していることがわかりますが、netcatコマンドを終了するにはCtrl+ cを押す必要があります。

こんにちはを送信した後、どうすれば終了できますか?


申し訳ありませんが、ノイズのために、私はマニュアルページをもう一度読んで、-qオプションを見つけました。

 echo -n "hello" | nc -4u -q1 localhost 8000

動作します(1秒後に終了します)。

何らかの理由で、で動作しません-q0


debianのマニュアルページ:-q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
ラッキードナルド

回答:


204

bashを使用している場合は、次のように書くこともできます

echo -n "hello" >/dev/udp/localhost/8000

そして、netcatのすべての特異性と非互換性を避けてください。

これは他のホストへの送信でも機能します。例:

echo -n "hello" >/dev/udp/remotehost/8000

これらはファイルシステム上の「実際の」デバイスではなく、bashの「特別な」エイリアスです。Bashマニュアルに追加情報があります。


24
わかりました、そうです。これがZSHでは機能しないことを明示させてください。
jturolla 2013

1
これは、netcatをいじくる方法よりも優れています。先端をありがとう!
johnboiles 2015

3
これは私が今まで見た中で最も驚くべきことかもしれません。
2015

4
何らかの理由で、Ubuntu 14.04 127.0.0.1では代わりにを使用する必要がありましたlocalhost。(はい、私は持っlocalhostてい/etc/hostsます。)
tuomassalo

3
/dev/udp/実際のファイルではありません。これは、bashによって特別に解釈されるファイル名のみです。
Peter Eisentraut 2016年

46

-q1netcatでオプションが見つかりませんでした。代わりに、私は-w1オプションを使用しました。以下は、udpパケットを任意のホストとポートに送信するために実行したbashスクリプトです。

#!/bin/bash

def_host=localhost
def_port=43211

HOST=${2:-$def_host}
PORT=${3:-$def_port}

echo -n "$1" | nc -4u -w1 $HOST $PORT

OS Xは次のように動作します:SimonWが言うように、「echo -n "test" | nc -4u -w0 localhost 9999」
Simon Unsworth

14

現在のnetcat(v0.7.1)では-cスイッチがあります:

-c, --close                close connection on EOF from stdin

したがって、

echo "hi" | nc -cu localhost 8000

トリックを行う必要があります。


3
これはGNU netcatにのみ当てはまり、BSD netcatには当てはまらないことに注意してください。
MarSoft

明確にするために、Linuxベースのnetcatでは、-cオプションには引数としてコマンドが必要であり、「/ bin / bashを介して指定された引数を実行する」-commandlinux.com/man-page/man1/nc.1.html
Blakeニール

5

Netcatは、改行ごとに1つのパケットを送信します。だからあなたは大丈夫です。もっと複雑なことをするなら、何か他のものが必要になるかもしれません。

これに気づいたとき、私はWiresharkをいじり回していました。それが役立つかどうかわからない。


3
これはTCPに対してのみ正しいと思います。UDPを使用すると、1つのパケットで複数の回線を送信します(収まる場合)。
sleske 2014

1
第単純にテストするecho -n "hello\nworld" >/dev/udp/localhost/514と、あなたは2行を取得します
bebbo

5

同じ問題がありましたが、-w 0オプションを使用して1つのパケットのみを送信して終了しました。次のコマンドを使用する必要があります。

echo -n "hello" | nc -4u -w0 localhost 8000

nc 1.10-41 + b1は受け付けません-w0。エラー:無効な待機時間0
palik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.