如何让 grep 在收到来自 netcat 的命令时立即退出?

如何让 grep 在收到来自 netcat 的命令时立即退出?

我想打开一个端口并监听命令,当该命令进来时,立即运行一个脚本。

我想出的最好的办法是(回声是我的脚本的替代品):

nc -lk 9999 | grep -q runcommand && echo "running command"

,然后我运行它来测试:

echo runcommand | nc localhost 9999

不幸的是,它似乎只在我第二次发送“runco​​mmand”时回显文本?

如何让 grep 立即退出,以便我的脚本立即运行?

答案1

像这样的构造something | grep -q可能存在的一个问题是,grep退出后,左侧命令在尝试写入之前看不到管道关闭。但对于我的 netcat(来自 Debian),即使给出,nc.openbsd它似乎也不会退出。因此永远不会触发。不过,我确实在 macOS 上使用 netcat 得到了您所描述的行为。-kgrep&&

一种可能性是将 netcat 包装在循环中,这似乎对我有用:

while true; do
    if nc -l 9999 | grep -q runcommand; then
        echo got correct string, exiting...
        break
    else
        echo got a connection, but not the correct string...
    fi
done

当然,如果仍然存在仅发送一行不会触发 netcat 退出的问题,您可以随时在其后面发送一条虚拟行来戳它:

printf "runcommand\n.\n" | nc localhost 9999

不确定这是否有帮助,并且不同的网络猫之间可能仍然存在差异。

相关内容