web-dev-qa-db-ja.com

netcatで1つのUDPパケットのみを送信するにはどうすればよいですか?

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

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

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

helloを送信した後に終了させるにはどうすればよいですか?


申し訳ありませんが、ノイズのため、マニュアルページを読み直し、-qオプションを見つけました。

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

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

何らかの理由で、-q0では機能しません。

100
Janne H

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

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

netcatのすべての特異性と非互換性を回避します。

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

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

これらは、ファイルシステム上の「実際の」デバイスではなく、bashの「特別な」 エイリアス です。

174

Netcatで-q1オプションが見つかりませんでした。代わりに、-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
46

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

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

したがって、

echo "hi" | nc -cu localhost 8000

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

8
Simon

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

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

5
Evan

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

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