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

122

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

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

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

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


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

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

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

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

Янне Х
источник
-q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
Справочная

Ответы:

205

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

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

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

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

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

Это не «настоящие» устройства в файловой системе, а «особые» псевдонимы bash . Дополнительная информация приведена в Руководстве по Bash .

Питер Эйзентраут
источник
25
Хорошо, вы правы, позвольте мне пояснить, что это не будет работать с ZSH.
jturolla
1
Это лучше, чем работать с netcat. Спасибо за чаевые!
johnboiles
3
Возможно, это самая удивительная вещь, которую я когда-либо видел.
freb 02
4
По какой-то причине мне нужно было использовать 127.0.0.1вместо этого localhostUbuntu 14.04. (Да, у меня есть localhostв /etc/hosts.)
tuomassalo
3
/dev/udp/не настоящий файл. Это всего лишь имя файла, специально интерпретируемое bash.
Питер Эйзентраут
46

Я не нашел эту -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
TraderJoeChicago
источник
OS X работает так: "echo -n" test "| nc -4u -w0 localhost 9999", как говорит SimonW
Саймон Ансуорт
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 07
Для ясности, в netcat на базе Linux параметр -c требует в качестве аргумента команду, которая «выполняет заданный аргумент через / bin / bash» - commandlinux.com/man-page/man1/nc.1.html
Blake Нил
5

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

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

Evan
источник
3
Я думаю, это правильно только для TCP. С UDP он отправляет несколько строк в одном пакете (если они подходят).
sleske
1
Нет. Просто протестируйте, echo -n "hello\nworld" >/dev/udp/localhost/514и вы получите 2 строчки
bebbo
5

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

echo -n "hello" | nc -4u -w0 localhost 8000
Саджад Баейди
источник
nc 1.10-41 + b1 не принимает -w0. Ошибка: недопустимое время ожидания 0
palik