Сценарий Bash не будет оставаться открытым в фоновом режиме после прохождения

Я не могу заставить следующий скрипт 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
1
задан 13 December 2012 в 02:49

1 ответ

Вы должны использовать опцию -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
3
ответ дан 25 May 2018 в 03:25

Другие вопросы по тегам:

Похожие вопросы: