Expor o awk sobre o tcp (inetd, socat, etc.)

2

Eu estava brincando com o awk e queria expô-lo em um soquete tcp.

No começo eu tentei, mas falhei com o micro-inetd. Pensando que talvez o problema possa estar no modo como os caracteres carriage returns / newlines são manipulados, decidi tentar mudar para socat.

Usar um comando remoto com o socat é bastante fácil:

socat TCP4-LISTEN:9000 EXEC:/bin/cat
socat TCP4-LISTEN:9000 SYSTEM:"/bin/python -i"

ambos trabalham

Mas ao tentar o mesmo com um simples comando awk (por exemplo, 'awk' {print NR} 'para contar progressivamente o número de linhas recebidas) eu não obtenho nada quando conecto com o socat de outro shell no mesmo máquina.

Eu tentei muitas coisas (algumas delas falharam com um erro de sintaxe que é um pouco obscuro para mim. Eu não posso nem tentar strat socat para ver exatamente o que está sendo executado, já que o comando atual exec'ing é delegado para o shell):

socat TCP4-LISTEN:9000 SYSTEM:"/usr/bin/awk '{print NR}'"
socat TCP4-LISTEN:9000 SYSTEM:'/usr/bin/awk "{print NR}"'
socat TCP4-LISTEN:9000 SYSTEM:'/usr/bin/awk "{print\ NR}"'

Eu também criei um pequeno script /tmp/testawk

#! /bin/sh
/usr/bin/awk '{print NR}'

(também com uma variante exec)

#! /bin/sh
exec /usr/bin/awk '{print NR}'

Ambos funcionam localmente, mas quando invocam

socat TCP4-LISTEN:9000 EXEC:/tmp/testawk

Não me manda de volta a saída

Pensando que o problema pode ser herança das manipulações stdin / stdout e / ou novamente manipulação de crlf ... Eu tentei também com:

socat TCP4-LISTEN:9000 EXEC:/tmp/testawk,nofork
socat TCP4-LISTEN:9000,crnl EXEC:/tmp/testawk
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk,crnl
socat TCP4-LISTEN:9000,crnl EXEC:/tmp/testawk,crnl

Encontrei outra pessoa que se queixou de problema semelhante , mas aparentemente falhou para angariar atenção

Alguma ideia do que está errado?

    
por berdario 20.02.2015 / 18:28

2 respostas

0

Você pode dizer ao socat para associar um arquivo com o programa awk ; isso força awk a executar no modo de buffer de linha e você obtém as respostas imediatas que está procurando.

Aqui está a linha de comando para escutar na porta 9000:

socat TCP4-LISTEN:9000 SYSTEM:'/tmp/awk.sh',pty,echo=0

E aqui está o conteúdo do script /tmp/awk.sh :

#!/usr/bin/awk -f
#
BEGIN   { print "This is the awk socket" }
        { print NR, $0 }
END     { print "All done" }

Execução da amostra:

$ nc -vvv otherhost 9000
otherhost [192.168.1.15] 9000 (?) open
This is the awk socket
hello world
1       hello world
how are you
2       how are you
boo
3       boo
^C sent 28, rcvd 61
    
por 20.02.2015 / 23:47
2

O Awk está imprimindo na saída padrão, que é armazenada em buffer quando ela aponta para um terminal e totalmente armazenada em buffer, se não estiver; isso significa que você deve obter a saída depois de preencher o buffer, ou seja, ela imprimiu (por exemplo) 4KB.

Você pode testar isso enviando muita saída (por exemplo, usando o programa yes); para corrigir você deve: - stdout do unbuffer awk (veja, por exemplo, link ) - use a chamada do sistema shutdown (2) do remetente (feio)

Qualquer solução melhor é bem-vinda

    
por 20.02.2015 / 18:34

Tags