Как отправить только один пакет UDP с Netcat? - PullRequest
100 голосов
/ 14 марта 2012

Я хочу отправить только одно короткое значение в UDP-пакете, но запускаю команду

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

Я вижу, что сервер получает привет , но мне нужно нажать Ctrl + c , чтобы выйти из команды netcat.

Как я могу заставить его выйти после отправки привет ?


Извините, из-за шума я перечитал справочную страницу и нашел вариант -q.

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

работает (выходит через 1 секунду).

Почему-то не работает с -q0.

Ответы [ 5 ]

177 голосов
/ 15 мая 2013

Если вы используете bash, вы можете написать

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

и избегайте всех особенностей и несовместимостей netcat.

Это также работает отправка на другие узлы, например:

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

Это не "настоящие" устройства в файловой системе, а bash "special" aliases .

46 голосов
/ 04 декабря 2012

Я не нашел опцию -q1 в моем netcat. Вместо этого я использовал опцию -w1. Ниже приведен скрипт bash, который я сделал для отправки пакета udp на любой хост и порт:

#!/bin/bash

def_host=localhost
def_port=43211

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

echo -n "$1" | nc -4u -w1 $HOST $PORT
8 голосов
/ 21 июля 2017

На текущем netcat (v0.7.1) у вас есть ключ -c:

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

Следовательно,

echo "hi" | nc -cu localhost 8000

должно сработать.

5 голосов
/ 25 мая 2013

Netcat отправляет один пакет на новую строку. Так что ты в порядке. Если вы делаете что-то более сложное, то вам может понадобиться что-то еще.

Я дурачился с Wireshark, когда понял это. Не знаю, поможет ли это.

3 голосов
/ 09 июля 2018

У меня была такая же проблема, но я использую опцию -w 0, чтобы отправить только один пакет и выйти. Вы должны использовать эту команду:

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