从 NC 收到第一条消息后,我无法让以下 bash 脚本保持打开状态:
#!/bin/bash
port=3333
nc -l $port | while read msg; do notify-send Alert "$msg"; done
收到第一条消息后,它就退出了。我希望它保持打开状态并继续监视来自 NC 的新消息。
我知道如果我nc -l port
在不使用 while 循环的情况下启动它,它将保持打开状态,并且我可以在两个连接之间聊天,甚至断开与连接主机的连接。
我使用以下方式发送消息:
echo 'done' | nc IP port
答案1
只需向 nc 添加 -k 选项即可。如下所示:
nc -l $port -k | while read msg; do notify-send Alert "$msg"; done
如图所示man nc
:
-k 强制 nc 在当前连接完成后继续监听另一个连接。如果未使用 -l 选项使用此选项,则会出现错误。
答案2
您应该使用-k
选项。nc -lk 3333
正如所述man nc
-k Forces nc to stay listening for another connection after its current
connection is completed. It is an error to use this option without the
-l option.
编辑:
请注意,我和我的同志在这里几乎同时发布了相同的答案。(就像那个人的想法:)) – 为了不完全冗余,我添加了一个同时使用-k
和不使用的样本。
第一的:
我知道如果我启动 nc -l port 而不使用 while 循环,它会保持打开状态,我可以在两个连接之间聊天,甚至断开与连接主机的连接。
我的情况不是这样。它只会显示一条消息,然后关闭。
第二:
我想说-k
,因为它与软件捆绑在一起并且运行良好,所以是最好的方法。但是,也可以将其包装在永恒循环中。
用来-v
获取更多信息。
#!/bin/bash
nc1()
{
nc -lkv $port |
while read msg; do
if [[ "$msg" =~ ^(q|quit|x|exit|halt)$ ]]; then
printf ";; Received shut down signal \`%s'\n" "$msg"
# Hack to terminate
printf "\n" | nc localhost $port &
break
fi
printf "MSG: %s\n" "$msg"
done
}
nc2()
{
while true; do
msg=$(nc -lv $port)
if [[ "$msg" =~ ^(q|quit|x|exit|halt)$ ]]; then
printf ";; Received shut down signal \`%s'\n" "$msg"
break
fi
printf "MSG: %s\n" "$msg"
done
}
port=3333
fun=nc1
while [[ "$1" ]]; do
case "$1" in
1) fun=nc1;;
2) fun=nc2;;
p) port="$2"; shift;;
*) printf "Unknown option \`%s'\n" "$1"
esac
shift
done
$fun
在另一个会话中:
printf "hello.\nHow are you?\n" | nc localhost 3333; sleep 1; printf "Good bye.\n" | nc localhost 3333; sleep 1; printf "x\n" | nc localhost 3333
有点超出问题的范围;但在某些情况下可能是相关的:如果您使用一些转储工具,sudo tcpdump -i lo -vvv -w nc.cap
您会注意到您得到的是:
消息“你好。\n你好吗?\n”:
1. TCP-connection; three-way handshake:
Client send SYN
Server responds SYN, ACK
Client responds ACK
2. DATA
Client send ACK, PUSH + message
Server responds ACK
3. TCP-termination; three-way handshake:
Client send ACK, FIN
Server responds ACK, FIN
Client send ACK