我想打开一个端口并监听命令,当该命令进来时,立即运行一个脚本。
我想出的最好的办法是(回声是我的脚本的替代品):
nc -lk 9999 | grep -q runcommand && echo "running command"
,然后我运行它来测试:
echo runcommand | nc localhost 9999
不幸的是,它似乎只在我第二次发送“runcommand”时回显文本?
如何让 grep 立即退出,以便我的脚本立即运行?
答案1
像这样的构造something | grep -q
可能存在的一个问题是,grep
退出后,左侧命令在尝试写入之前看不到管道关闭。但对于我的 netcat(来自 Debian),即使给出,nc.openbsd
它似乎也不会退出。因此永远不会触发。不过,我确实在 macOS 上使用 netcat 得到了您所描述的行为。-k
grep
&&
一种可能性是将 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
不确定这是否有帮助,并且不同的网络猫之间可能仍然存在差异。