tcpdump - registrador de dns em tempo real com pipe

1

Eu quero obter registros de DNS A em tempo real com o tcpdump em stdout.

tcpdump -i any dst port 53 | awk '/ A\? / {u = NF - 1; print $u}' | sed 's/.$//g'

Não há saída proveniente da linha acima. O Tcpdump parece ainda sendo armazenado em caches ou algo assim. Eu testei -l --immediate-mode e -U também.

A linha abaixo é exibida corretamente (em tempo real), mas obviamente não filtrada (sem grep / awk):

tcpdump -i any dst port 53

Se eu enviar suas linhas de saída manualmente para os comandos awk / sed acima, eles funcionam corretamente.

Tudo testado no Arch Linux e Android 8.1 (bash, tcpdump 4.9.2).

Pergunta: Como obter a saída do tcpdump em tempo real com pipe / awk / sed?

Existe um tópico antigo de 2011 que não resolve o problema. Como processar / enviar saída TCPDUMPs em tempo real

    
por Maniaxx 17.07.2018 / 20:13

1 resposta

1

Experimente esta variante:

tcpdump -l -i any dst port 53 | stdbuf -oL awk '/ A\? / {u = NF - 1; print $u}' | sed 's/.$//g'

Você tem que armazenar em buffer todas as linhas de saída do tcpdump, a opção -l é usada para isso.

De man tcpdump :

-l     Make stdout line buffered.  Useful if you want to see the data while capturing it.

Para fazer o buffer de linha de saída awk stdbuf é usado.

-o, --output=MODE  adjust standard output stream buffering
If MODE is 'L' the corresponding stream will be line buffered.
    
por 17.07.2018 / 22:09

Tags