Como evitar o envio de EOF de um script que analisa solicitações e envia respostas para o netcat

2

Eu fiz um servidor simples usando netcat e backpipe:

mkfifo backpipe
nc -l 8080 < backpipe | parseRequests.sh > backpipe

O conteúdo de "parseRequests.sh" é apenas:

#!/bin/sh
if [ "$1" = "1+1" ]; then echo "2"; else echo "0"; fi

Quando me conectei a este servidor em outra máquina usando

nc 10.0.0.2 8080

A conexão terminou imediatamente com "0" retornado.

Minha pergunta é: como posso manter a conexão para que eu possa digitar muitas solicitações no lado do cliente? Se eu usar 'tee log.txt' em vez de 'parseRequests.sh', a conexão pode ser mantida ativa. Eu acho que o comando 'echo' no "parseRequests.sh" enviou um sinal EOF para nc, o que fez com que o nc saísse imediatamente. Como posso evitar isso?

Eu sei que posso ouvir solicitações em uma porta e enviar respostas usando outra porta em um loop. Mas eu prefiro manter a mesma porta viva para os dois pedidos e respostas.

    
por Jing 09.12.2013 / 06:04

1 resposta

5

O programa no lado esquerdo de um pipe não recebe um EOF (que não é um sinal) quando o lado direito do pipeline termina. Obtém um SIGPIPE que diz para terminar. O problema é que você não está lendo nada do pipeline nem lendo nenhum dado do pipeline. Você provavelmente quer um loop while read que irá ler stdin enquanto estiver vivo:

while read -r value; do
    if [ "$value" = "1+1" ]; then 
        echo "2";
    else
        echo "0";
    fi
done
    
por 09.12.2013 / 06:47