Я не могу заставить следующий скрипт 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. Например:
nc -l $port -k | while read msg; do notify-send Alert "$msg"; done
Как видно из man nc
:
-k Принуждает nc продолжать прослушивать другое соединение после завершения его текущего соединения. , Ошибка использования этой опции без опции -l.
BLOCKQUOTE>
Необходимо использовать -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 порт без цикла с условием продолжения, это остается открытым, и я могу болтать далеко между этими двумя соединениями, даже разъединяются от связанного хоста.
Дело обстоит не так для меня. Это закрывается после одного сообщения.
Во-вторых:
Я сказал бы -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
Вы заметите, что то, что Вы получаете:
Сообщение "привет \nHow является Вами? \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