Как отправить только один пакет UDP с netcat?

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

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

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

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


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

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

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

По какой-то причине это не работает с -q0.

Ответ 1

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

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

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

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

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

Это не "настоящие" устройства в файловой системе, а "специальные" псевдонимы bash. В руководстве по Bash есть дополнительная информация.

Ответ 2

Я не нашел параметр -q1 на моем netcat. Вместо этого я использовал параметр -w1. Ниже bash script я сделал для отправки пакета 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

Ответ 3

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

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

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

echo "hi" | nc -cu localhost 8000

должен сделать трюк.

Ответ 4

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

Я обманывал Wireshark, когда понял это. Не знаю, помогает ли это.

Ответ 5

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

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