我在脚本中使用 netcat 时遇到问题bash
。
我想在发送命令后匹配特定输出并尽快继续脚本执行(不等待 netcat 超时)
$> echo 'my_command' | nc -q 10 <IP> <PORT> | grep -m 1 EXPECTED_OUTPUT
# ISSUE: Closes the connection quite instantly
$> echo $?
$> 1 # grep did not get (yet) the output of nc
另一种尝试:
$> echo 'my_command' | nc -w 1 <IP> <PORT> | grep -m 1 EXPECTED_OUTPUT
Binary file (standard input) matches
# ISSUE: Wait until the timeout expires
$> echo $?
$> 0
欲了解更多信息:
如果没有命令,netcat 会打印一条横幅消息:
$>nc <IP> <PORT>
welcome message
我不反对其他工具(telnet
,...)
我想要一个bash
符合标准的解决方案。
由于预期的消息应该在一秒钟内到达,所以我使用了-w 1
超时nc
答案1
你想将其设置为nc
一旦grep
完成就被杀死。这是一种方法:
( subshell_pid=$BASHPID ; echo 'my_command' | nc $IP $PORT > >(grep -m 1 EXPECTED_OUTPUT ; kill -13 -- -$subshell_pid ; ) )
这一切都在子 shell 中运行,然后在grep
完成时杀死由子 shell 启动的所有进程。
这>()
是流程替代,它允许您从一个命令传输到多个命令。