Я не могу заставить следующий скрипт bash оставаться открытым после того, как первое сообщение получено от NC:
#!/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
Вы должны использовать опцию -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 без цикла while, он остается открытым, и я могу общаться между двумя соединениями, даже отключаясь от подключенного хоста.Это не относится ко мне. Он закрывается после одного сообщения.
Second:
Я бы сказал, -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
И в другом сеансе:
Выходит за рамки вопроса; но может быть уместным в некоторых случаях: если вы используете какой-либо инструмент дампа, то есть sudo tcpdump -i lo -vvv -w nc.cap, вы заметите, что вы получаете:
Сообщение «привет». \ nКак вы? \ n ": [ ! d17]
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