Netcat/socat поведение с пайпингом и UDP?
Я думаю, это близко к Linux - Netcat перестает слушать UDP-трафик - Super User, но я подумал, что лучше спросить в любом случае
Что касается версий Netcat, я использую Ubuntu 11.04 и по умолчанию netcat
на нем, который я предполагаю, является openbsd
один:
$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
[-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
[-x proxy_address[:port]] [hostname] [port[s]]
Вот что я нахожу странным: первый случай работает как положено - я открываю сервер UDP в одном терминале:
$ sudo nc -ul 5000
... и в другом терминале я инициирую новое соединение с UDP-клиентом и набираю hello
три раза, нажимая ENTER после каждого:
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
... и возвращаясь к серверному терминалу, он напечатал hello
три раза, как и ожидалось:
$ sudo nc -ul 5000
hello
hello
hello
^C
Пока все хорошо, все работает как положено. Однако, скажем, теперь я пытаюсь сделать то же самое, передавая данные в клиент; поэтому сначала установите UDP-сервер в одном терминале:
$ sudo nc -ul 5000
... а в другом, передать некоторые данные в nc
как клиент UDP:
$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C
... после команды клиента оболочка как бы зависает, как будто ждет ввода - вот я и набираю hello
и введите еще два раза; но сервер зарегистрировал только первый hello
(который был передан через echo
). Кроме того, даже если вы нажмете Ctrl-C, и попытаетесь повторить клиент echo hello | nc -u 127.0.0.1 5000
команда, сервер по- прежнему останется, сообщив только самое первое hello
:
$ sudo nc -ul 57130
hello
^C
... и только после остановки сервера с помощью Ctrl-C и перезапуска его можно повторить клиент echo hello | nc -u 127.0.0.1 5000
командуй и наблюдай как это работает.
Это путь nc
должен вести себя? Я ожидаю, что по крайней мере повторные звонки echo hello | nc -u 127.0.0.1 5000
будет зарегистрирован - без перезапуска сервера? Или, может быть, есть специальный переключатель командной строки для такого поведения?
РЕДАКТИРОВАТЬ: я нашел эту хорошую презентацию PDF: socat - Обработка всех видов сокетов, которая содержит следующее netcat
против socat
заметки:
netcat - ограничения
● только один выстрел (заканчивается после закрытия гнезда)
...
Примеры 1: замена netcat
...
● UDP-клиент с портом источника:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● TCP-сервер:
нк-л-р 8080
socat - tcp-l: 8080, reuseaddr
...
... однако, я получаю то же поведение, что и выше, если я заменю команду сервера на "socat - udp4-listen:5000,reuseaddr
"- и клиентская строка с"socat - udp:127.0.0.1:5000
"... с вводом по трубопроводу"echo hello | socat - udp:127.0.0.1:5000
"Единственное отличие состоит в том, что здесь, по крайней мере, команда существует после слова hello
было отправлено - однако, повторяющиеся последовательные запуски этой команды не вызовут никакого приема на сервере, пока сервер не будет перезапущен.
3 ответа
Хорошо, я думаю, что по крайней мере я получил что-то с socat
а именно, вариант fork
необходимо добавить к строке сервера:
$ socat - udp4-listen:5000,reuseaddr,fork
... а затем, в другом терминале, мы можем позвонить echo
трубка в socat
клиентская строка несколько раз в командной строке, так как она будет завершена немедленно (ну, через полсекунды:)):
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
... и возвращаясь к первому терминалу, мы видим, что сервер успешно показал все три hello
s:
$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C
Обратите внимание, что даже с fork
-ed socat
сервер, линия echo "hello" | nc -u 127.0.0.1 5000
будет по-прежнему "блокироваться", как будто ожидает ввода пользователя; однако теперь после Ctrl-C и повторного запуска команды, т.е.
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
... fork
-ed socat
сервер покажет три hello
без необходимости перезапуска..
Похоже, это openBSD netcat
не имеет fork
вариант - но я не уверен, что есть тот, который ему соответствует..
В любом случае, надеюсь, это кому-то поможет,
Ура!
Ваш netcat только читает вывод из stdout echo, когда вы используете pipe, он больше не "подключен" к клавиатуре. Чтобы получить ожидаемый ответ, вы можете добавить свои три "привет" в файл запустить
cat [myfile] | nc -u 127.0.0.1 5000
Если вы выполните связку прослушивающего nc, он покажет, что netcat ожидает соединения, и, как только он его установит, подключится к этому хосту и порту, игнорируя все остальные. Вам нужно добавить '-k', чтобы продолжить работу, и '-w 0', чтобы тайм-аут каждого соединения через 0 секунд. Думаю, Сокат - лучший выбор.