【问题标题】:How to make an Echo server with Bash?如何使用 Bash 制作 Echo 服务器?
【发布时间】: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 包)。

标签: bash tcp netcat


【解决方案1】:

如果您使用 ncat 而不是 nc,您的命令行可以在多个连接下正常工作,但(正如您所指出的)没有 -p。

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

ncat 可通过http://nmap.org/ncat/ 获得。

附:使用原始的 Hobbit 的 netcat (nc) 不支持 -c 标志。

更新:现在需要 -k (--keep-open) 来处理多个连接。

【讨论】:

  • 谢谢!它可以工作,但稍作改动 - 我们应该在没有“-p”选项的情况下使用它:ncat -l 2000 -c 'xargs -n1 echo'
  • @BinWang 已更新。按照下面的 douyw 链接获取更多说明
  • xargs -n1 echo 按空格分割行,但 xargs -l1 echo 保持行不变。
【解决方案2】:

这里有一些例子。 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 设置。
【解决方案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
    

    但是远程 shell 示例有效:

    cat fifo | /bin/sh -i 2>&1 | netcat -l -k localhost 8000 > fifo
    

    我不知道如何简单地处理并发请求。

    【讨论】:

      【解决方案5】:

      怎么样……

      #! /bin/sh
      
      while :; do
      /bin/nc.traditional -k -l -p 3342 -c 'xargs -n1 echo'
      done
      

      【讨论】:

      • 而 :;做 /bin/nc.traditional -k -l -p 3342 -c xargs -n1 echo ;完成
      猜你喜欢
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 2010-11-03
      • 2016-12-15
      • 2017-01-11
      • 1970-01-01
      相关资源
      最近更新 更多