Diferentes estilos de redirecionamento com netcat e tee dando resultados diferentes

3

Ao tentar rastrear uma solicitação HTTP GET simples e sua resposta com nc , estou encontrando algo estranho.

Isso, por exemplo, funciona bem: o arquivo in termina contendo a solicitação HTTP GET e o arquivo out a resposta.

$ mkfifo p
$ (nc -l 4000 < p | tee in | nc web-server 80 | tee out p)&
[1] 8299
$ echo "GET /sample" | nc localhost 4000
This is contents of /sample...
$ cat out
This is contents of /sample...
$

No entanto, se eu substituir o tee out p acima por tee out >p , o arquivo out ficará vazio.

$ (nc -l 4000 < p | tee in | nc web-server 80 | tee out > p)&
[1] 8312
$ echo "GET /sample" | nc localhost 4000
$ cat out
$ 

Por que isso deveria ser assim?

EDIT: estou no RHEL 5.3 (Tikanga).

    
por Harry 16.05.2012 / 13:27

2 respostas

3

O problema é que você está usando redirecionamentos de shell para ler e gravar no mesmo arquivo. Verifique p depois, estará vazio também. O shell o abre no modo de leitura, truncando o arquivo, enquanto ele está configurando o pipeline antes de executar os comandos. No entanto, usar tee , já que ele abre o próprio arquivo, significa que o arquivo não será truncado até que o conteúdo seja lido para a entrada. Esse é um comportamento bem conhecido e documentado e o motivo pelo qual você não pode simplesmente usar redirecionamentos para fazer alterações em linha nos arquivos.

    
por 16.05.2012 / 15:28
1

De tee manpage do FreeBSD:

DESCRIPTION
 The tee utility copies standard input to standard output, making a copy
 in zero or more files.  The output is unbuffered.

unbuffered é a sugestão, o redirecionamento de saída do Bash (ou do seu shell) ( > p ) é provavelmente armazenado em buffer, causando o comportamento diferente.

(Me desculpe, eu não posso ter mais certeza disso, mas eu pego os + 1s no comentário como indicadores para essa ser a trilha certa ...)

    
por 16.05.2012 / 15:27

Tags