O script Bash não ficará aberto em segundo plano depois de passar por enquanto

3

Não consigo que o seguinte script bash fique aberto depois que a primeira mensagem é recebida do NC:

#!/bin/bash
port=3333
nc -l $port | while read msg; do notify-send Alert "$msg"; done

Após a primeira mensagem, sai. Eu quero que ele fique aberto e continue monitorando novas mensagens do NC.

Eu sei que se eu lançar nc -l port sem o loop while ele permanecerá aberto e eu poderei conversar entre as duas conexões, até mesmo desconectar do host conectado.

Estou enviando a mensagem usando:

echo 'done' | nc IP port
    
por jfreak53 12.12.2012 / 21:49

2 respostas

3

Basta adicionar uma opção -k ao nc. Assim:

nc -l $port -k | while read msg; do notify-send Alert "$msg"; done

Como visto em man nc :

  

-k   Força o nc a ficar atento a outra conexão após a conclusão da conexão atual. É um erro usar esta opção sem a opção -l.

    
por Pavel A 12.12.2012 / 23:01
3

Você deve usar a opção -k . nc -lk 3333

Como afirmado por 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.

Editar:
Observe que eu e meu camarada aqui postamos a mesma resposta perto de simultaneamente. ( Como a mente daquele:) ) - Para não ser completamente redundante, estou adicionando uma amostra usando -k e não.

Primeiro:

  

Eu sei que se eu iniciar nc -l porta sem o loop while ele permanece aberto e eu posso conversar entre as duas conexões, até mesmo desconectar do host conectado.

Este não é o caso para mim. Fecha após uma mensagem.

Segundo:

Eu diria que -k , como é empacotado com o software e funciona bem, seria o melhor caminho a percorrer. No entanto, também é possível envolvê-lo em um loop eterno.

Usando -v para obter mais informações.

#!/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 [[ "" ]]; do
    case "" in
    1) fun=nc1;;
    2) fun=nc2;;
    p) port=""; shift;;
    *) printf "Unknown option \'%s'\n" ""
    esac
    shift
done

$fun

E em outra sessão:

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

Indo um pouco além do escopo da questão; mas pode ser relevante em alguns casos: Se você usar alguma ferramenta de despejo, por exemplo, sudo tcpdump -i lo -vvv -w nc.cap , perceberá que o resultado é:

Mensagem "Olá. \ nComo você está? \ 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
    
por Runium 12.12.2012 / 23:02