【问题标题】:Netcat TCP Programming with Bash使用 Bash 进行 Netcat TCP 编程
【发布时间】:2014-12-21 15:31:27
【问题描述】:

我正在尝试使用严格的 bash 脚本进行一些基本的 TCP 客户端通信。我可以使用 netcat,所以到目前为止我已经编写了这个循环:

nc 10.0.0.104 4646 | while read line
do
   if [ "$line" == '{"cmd": 1}' ]
   then
      # Send text back to the TCP server
      echo '{"error": 0}'
   fi
done

该脚本可以成功连接到我正在使用的服务器应用程序,但我无法弄清楚如何将文本发送回 netcat 进程。

【问题讨论】:

    标签: linux bash tcp netcat


    【解决方案1】:

    对于 Bash≥4,您可以使用 coproc:

    #!/bin/bash
    
    coproc nc { nc 10.0.0.104 4646; }
    
    while [[ $nc_PID ]] && IFS= read -r -u${nc[0]} line; do
        case $line in
            ('{"cmd": 1}')
                printf >&${nc[1]} '%s\n' '{"error": 0}'
                ;;
            (*)
                printf >&2 '%s\n' "Received line:" "$line"
                ;;
        esac
    done
    

    这样可以避免使用临时 fifo。如果没有coproc,我想剩下的唯一选择就是明确使用fifos。这是一个例子:

    #!/bin/bash
    
    mkfifo fifo_in
    
    while IFS= read -r line; do
        case $line in
            ('{"cmd": 1}')
                printf '%s\n' '{"error": 0}'
                ;;
            (*)
                printf >&2 '%s\n' "Received line:" "$line"
                ;;
        esac
    done < <(nc 10.0.0.104 4646 < fifo_in) > fifo_in
    

    为此,您必须管理 fifo 的创建和删除:您需要使用 mktemp 创建一个临时目录,在其中创建 fifo,然后 trap 您的脚本以便退出一切都清理干净了。


    /dev/tcp

    如果您的 Bash 编译时支持网络重定向,您可以完全摆脱 nc 以及 fifos 和协同进程:

    #!/bin/bash
    
    # open TCP connection, available on file descriptor 3
    exec 3<> /dev/tcp/10.0.0.104/4646 || exit
    
    while IFS= read -r -u3 line; do
        case $line in
            ('{"cmd": 1}')
                printf >&3 '%s\n' '{"error": 0}'
                ;;
            (*)
                printf >&2 '%s\n' "Received line:" "$line"
                ;;
        esac
    done
    

    这很可能是最甜蜜的解决方案!

    【讨论】:

    • 好东西。如果 O.P. 不能使用 bash 4,这些功能在 ksh 中已经存在好几年了。但这也取决于可用的 ksh 版本,但值得测试。 O.P. 可以避免在生产环境中安装新的东西。祝大家好运。
    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 2017-12-10
    • 2014-08-03
    • 2014-03-02
    • 1970-01-01
    • 2012-03-30
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多