Як надіслати лише один UDP-пакет з netcat?


122

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

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

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

Як я можу змусити його кинути роботу після надсилання привіт ?


Вибачте, за шум я перечитав сторінку man і знайшов -qваріант.

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

працює (закривається через 1 секунду).

Чомусь це не працює -q0.


Сторінка чоловіка на debian:-q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
luckydonald

Відповіді:


205

Якщо ви використовуєте bash, ви також можете написати

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

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

Це також працює надсиланням до інших хостів, наприклад:

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

Це не "справжні" пристрої у файловій системі, але створюють "спеціальні" псевдоніми . Додаткова інформація міститься в Посібнику з Bash .


25
Гаразд, ви праві, дозвольте мені прямо зрозуміти, що це не буде працювати зі ZSH.
jturolla

1
Це набагато краще, ніж спілкування з мережею. Дякую за пораду!
johnboiles

3
Це може бути найдивовижніше, що я коли-небудь бачив.
фребр

4
З якої - то причини, мені потрібно використовувати 127.0.0.1замість цього на localhostна Ubuntu 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

OS X працює так: "echo -n" test "| nc -4u -w0 localhost 9999", як каже SimonW
Simon Unsworth

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

Для наочності, на базі Linux netcat опція -c вимагає команду як аргумент, яка "виконує даний аргумент через / bin / bash" - commandlinux.com/man-page/man1/nc.1.html
Blake Ніл

5

Netcat надсилає один пакет за новий рядок. Отже, ти добре. Якщо ви робите щось складніше, то вам може знадобитися щось інше.

Я дурив з Wireshark, коли зрозумів це. Не знаю, чи допомагає це.


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
ок.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.