BASH:从 netcat 连接读取行

BASH:从 netcat 连接读取行

我有一个简单的脚本,它从使用 netcat 初始化的连接中读取一些行。客户端可以传输一些“命令”。如果客户端写入“退出”,我喜欢关闭连接。

但是:传输“退出”后,脚本会回显“已收到‘退出’”,但仍显示在“再见”出现之前还有更多台词。

echo "Start listening on port $PORT ..."
    (echo "Welcome. Please give me one of the following commands: 
            $AVAILABLECOMMANDS") | nc -q -1 -l $PORT | while read line
    do
            if [ "$line" == 'exit' ]; then
                    echo "Received 'exit'"
                    break
            else
                    result=$(executeCommand $line)
                    echo "$result"
            fi
    done
    echo "Good bye"

我想我必须重写循环但我不知道该怎么做。

有人可以帮忙吗?

谢谢。

答案1

正如解释的那样这里,bash 选择仅当管道中的所有命令都结束时才退出。这里,netcat不想停止,但由于结束管道已损坏,netcat因此失败。这就是为什么您需要再等待一次才能退出循环(顺便说一句,退出循环时会出现错误)。这是一个没有此管道问题的版本:

#!/bin/bash

echo "Start listening on port 12345 ..."
while read line
do
    if [ "$line" == 'exit' ]; then
        echo "Received 'exit'"
        break
    else
        echo "$line"
    fi
done < <((echo "Welcome. Please give me one of the following commands: $AVAILABLECOMMANDS") | nc -q -1 -l 12345)
echo "Good bye"

答案2

获取传入数据并通过 netcat 传输数据的便捷方法。

#!/bin/bash

netcat -l localhost 12345  # port 12345
exec 6<>/dev/tcp/localhost/12345

while read <&6
do
        echo "$REPLY"
done

相关内容