Эхо-сервер с bash
Как написать эхо-сервер bash script с помощью таких инструментов, как nc, echo, xargs и т.д., которые могут одновременно обрабатывать запросы от нескольких клиентов, каждый с надежным подключением.
Лучшее, что я придумал до сих пор, -
nc -l -p 2000 -c 'xargs -n1 echo'
но он позволяет только одно соединение.
Ответы
Ответ 1
Если вы используете ncat вместо nc, ваша командная строка отлично работает с несколькими подключениями, но (как вы указали) без -p.
ncat -l 2000 -k -c 'xargs -n1 echo'
ncat доступен в http://nmap.org/ncat/.
P.S. с оригиналом Hobbit netcat (nc) флаг -c не поддерживается.
Обновление: теперь -k (--keep-open) требуется для обработки нескольких соединений.
Ответ 2
Вот несколько примеров. Простые сервисы ncat
Эхо-сервер TCP
ncat -l 2000 --keep-open --exec "/bin/cat"
Эхо-сервер UDP
ncat -l 2000 --keep-open --udp --exec "/bin/cat"
Ответ 3
В случае, если ncat не является вариантом, будет также работать socat:
socat TCP4-LISTEN:2000,fork EXEC:cat
fork
необходим, чтобы можно было принять несколько соединений. Добавление reuseaddr
в TCP4-LISTEN
может быть удобным.
Ответ 4
netcat
решение, предварительно установленное в Ubunutu
Предварительно установленный в Ubuntu 16.04 netcat
поставляется с 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
Я не знаю, как обращаться только с параллельными запросами.