Эхо-сервер с netcat или socat
Я хочу, чтобы UDP-эхо-сервер получал пакеты и отвечал точно, что он получил. Как я могу просто сделать это, используя netcat
или же socat
? Он должен оставаться живым вечно и обрабатывать пакеты, приходящие с нескольких хостов.
6 ответов
Другой похожий на netcat инструмент - это версия nmap, ncat
, который имеет много встроенных вкусностей, чтобы упростить подобные вещи. Это будет работать:
ncat -e /bin/cat -k -u -l 1235
-e означает, что он выполняет /bin/cat (чтобы отразить то, что вы печатаете)
-k означает keep-alive, что он продолжает слушать после каждого соединения
-u означает удп
-l 1235 означает, что он прослушивает порт 1235
Я использовал socat -v PIPE udp-recvfrom:5553,fork
запустить сервер и socat - udp:localhost:5553
для клиентов. Это была отличная помощь!
Вы также можете использовать socat (вместо netcat) в качестве эхо-сервера и netcat в качестве клиента.
Эхо-сервер Socat (прослушивает TCP-порт 1234):
socat -v tcp-l:1234,fork exec:'/bin/cat'
Клиент Netcat (подключается к serverip через TCP-порт 1234):
nc serverip 1234
netcat
решение предварительно установлено в Ubunutu
netcat
предустановленный в Ubuntu 16.04 происходит из netcat-openbsd
и не имеет -c
вариант, но руководство дает решение:
sudo mknod -m 777 fifo p
cat fifo | netcat -l -k localhost 8000 > fifo
Тогда пример клиента:
echo abc | netcat localhost 8000
TODO: как изменить значение входной строки? Следующее не возвращает никакого ответа:
cat fifo | tr 'a' 'b' | netcat -l -k localhost 8000 > fifo
Однако пример удаленной оболочки работает:
cat fifo | /bin/sh -i 2>&1 | netcat -l -k localhost 8000 > fifo
Я просто не знаю, как обращаться с параллельными запросами.
Вы можете написать программу на C, которая разветвляется nc -u -l -p 4321
и затем использует dup(2) для подключения:
- nc stdin с выводом родителя
- nc stdout со стандартным родителем
Затем в бесконечном цикле родитель читает из стандартного ввода и записывает в стандартный вывод все, что читает родитель.
Если вы работаете в Windows и используете unix-подобную среду, такую как cygwin, netcat migth не предоставляет параметр -e. Это работало очень хорошо для меня.