Как отправить только один пакет 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