Как сделать сервер Echo с помощью Bash?

Как написать сценарий bash эхо-сервера, используя такие инструменты, как nc, echo, xargs и т. д., способные одновременно обрабатывать запросы от нескольких клиентов, каждый из которых имеет надежное соединение?

Лучшее, что я придумал до сих пор, это

nc -l -p 2000 -c 'xargs -n1 echo'

но он позволяет только одно соединение.


person Roskoto    schedule 04.12.2011    source источник
comment
nc Ubuntu 12.04 не имеет опции -c =( (netcat-openbsd package).   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 07.05.2014


Ответы (5)


Если вы используете ncat вместо nc, ваша командная строка отлично работает с несколькими подключениями, но (как вы указали) без -p.

ncat -l 2000 -k -c 'xargs -n1 echo'

ncat доступен по адресу http://nmap.org/ncat/.

P.S. с оригинальным netcat (nc) Хоббита флаг -c не поддерживается.

Обновление: -k (--keep-open) теперь требуется для обработки нескольких подключений.

person David Costa    schedule 04.12.2011
comment
Спасибо! Это работает, но с небольшим изменением — мы должны использовать его без опции -p: ncat -l 2000 -c 'xargs -n1 echo' - person Roskoto; 05.12.2011
comment
@BinWang обновлен. Перейдите по ссылке douyw ниже для получения дополнительных объяснений. - person David Costa; 26.06.2013
comment
xargs -n1 echo разбивает строки по пробелам, но xargs -l1 echo сохраняет строки нетронутыми. - person Dan Ross; 19.04.2016

Вот несколько примеров. простые сервисы ncat

Эхо-сервер TCP

ncat -l 2000 --keep-open --exec "/bin/cat"

UDP-эхо-сервер

ncat -l 2000 --keep-open --udp --exec "/bin/cat"
person douyw    schedule 10.11.2012
comment
Имейте в виду, однако, что с --udp ncat будет держать соединения открытыми, и если вы не хотите достигать предела по умолчанию в 100 соединений, вам следует либо увеличить максимум с помощью параметра --max-conns, либо позволить соединениям прерываться после тайм-аута простоя, который вы можете установить с помощью --idle-timeout. - person josch; 10.08.2016

Если ncat не подходит, socat также сработает:

socat TCP4-LISTEN:2000,fork EXEC:cat

fork необходим, чтобы можно было принять несколько соединений. Добавление reuseaddr к TCP4-LISTEN может быть удобным.

person Caesar    schedule 08.03.2016

Решение 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

Однако я не знаю, как просто обрабатывать одновременные запросы.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 29.05.2017

как насчет...

#! /bin/sh

while :; do
/bin/nc.traditional -k -l -p 3342 -c 'xargs -n1 echo'
done
person Mohan Nbs    schedule 15.03.2019
comment
пока :; сделать /bin/nc.traditional -k -l -p 3342 -c xargs -n1 echo ; Выполнено - person Mohan Nbs; 15.03.2019