【发布时间】:2012-01-12 15:14:54
【问题描述】:
如何使用 nc、echo、xargs 等工具编写 echo 服务器 bash 脚本,以同时处理来自多个客户端的请求,每个客户端都具有持久连接?
到目前为止,我想出的最好的是
nc -l -p 2000 -c 'xargs -n1 echo'
但它只允许单个连接。
【问题讨论】:
-
Ubuntu 12.04 的
nc没有-c选项=( (netcat-openbsd包)。
如何使用 nc、echo、xargs 等工具编写 echo 服务器 bash 脚本,以同时处理来自多个客户端的请求,每个客户端都具有持久连接?
到目前为止,我想出的最好的是
nc -l -p 2000 -c 'xargs -n1 echo'
但它只允许单个连接。
【问题讨论】:
nc 没有-c 选项=( (netcat-openbsd 包)。
如果您使用 ncat 而不是 nc,您的命令行可以在多个连接下正常工作,但(正如您所指出的)没有 -p。
ncat -l 2000 -k -c 'xargs -n1 echo'
ncat 可通过http://nmap.org/ncat/ 获得。
附:使用原始的 Hobbit 的 netcat (nc) 不支持 -c 标志。
更新:现在需要 -k (--keep-open) 来处理多个连接。
【讨论】:
xargs -n1 echo 按空格分割行,但 xargs -l1 echo 保持行不变。
这里有一些例子。 ncat simple services
TCP 回显服务器
ncat -l 2000 --keep-open --exec "/bin/cat"
UDP 回显服务器
ncat -l 2000 --keep-open --udp --exec "/bin/cat"
【讨论】:
--udp,ncat 将保持“连接”打开,如果您不想达到 100 个连接的默认限制,那么您应该使用--max-conns 选项或让“连接”在空闲超时后终止,您可以使用 --idle-timeout 设置。
如果 ncat 不是一个选项,socat 也可以工作:
socat TCP4-LISTEN:2000,fork EXEC:cat
fork 是必需的,因此可以接受多个连接。将reuseaddr 添加到TCP4-LISTEN 可能会很方便。
【讨论】:
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
但是远程 shell 示例有效:
cat fifo | /bin/sh -i 2>&1 | netcat -l -k localhost 8000 > fifo
我不知道如何简单地处理并发请求。
【讨论】:
怎么样……
#! /bin/sh
while :; do
/bin/nc.traditional -k -l -p 3342 -c 'xargs -n1 echo'
done
【讨论】: