Como processar / enviar saída TCPDUMPs em tempo real

23

Se eu quiser tcpdump solicitações de DNS por clientes (em um roteador OpenWrt 10.04), então eu

root@ROUTER:/etc# tcpdump -n -i br-lan dst port 53 2>&1       
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br-lan, link-type EN10MB (Ethernet), capture size 96 bytes
22:29:38.989412 IP 192.168.1.200.55919 > 192.168.1.1.53: 5697+ A? foo.org. (25)
22:29:39.538981 IP 192.168.1.200.60071 > 192.168.1.1.53: 17481+ PTR? 150.33.87.208.in-addr.arpa. (44)
^C
2 packets captured
3 packets received by filter
0 packets dropped by kernel

Tudo bem. Mas. Por que não posso canalizar a saída do tcpdumps em tempo real?

root@ROUTER:/etc# tcpdump -n -i br-lan dst port 53 2>&1 | awk '/\?/ {print $3}'
^C
root@ROUTER:/etc# 

Se eu awk, etc. qualquer coisa depois do tcpdump, eu não obtenho QUALQUER saída. Por que é que? Por que não posso processar a saída do tcpdump com o pipelining em tempo real? (de modo que, por exemplo: no exemplo em apenas as saídas da terceira coluna)

Existe alguma solução para isso?

    
por LanceBaynes 02.07.2011 / 22:34

5 respostas

30

Direto de man tcpdump

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

              tcpdump -l | tee dat

       or

              tcpdump -l > dat & tail -f dat

       Note that on Windows,''line buffered'' means ''unbuffered'', so that 
       WinDump will write each character individually if -l is specified.

       -U is similar to -l in its behavior, but it will cause output to be 
       ''packet-buffered'', so that the output is written to stdout at the 
       end of each packet rather than at the end of each line; this is 
       buffered on all platforms, including Windows.
    
por 11.07.2011 / 22:42
6

Use a opção -U em combinação com -w para que tcpdump escreve pacotes imediatamente.

    
por 09.09.2015 / 09:45
3

O tcpdump aparentemente está armazenando em buffer a saída quando grava em um pipe. Não está liberando a saída para cada gravação, portanto, o sistema gravará a saída em cerca de 4k byte chunks. Seu filtro está limitando a colocação para que você não veja nada até que o filtro tenha escrito saída suficiente. Depois de coletar o suficiente, ele será gravado em um pedaço e você deverá ver várias linhas emitidas.

Tente acionar pesquisas de DNS muitas vezes e veja o que acontece depois.

    
por 02.07.2011 / 23:28
1

expect tem um comando unbuffer para enganar os comandos, assumindo que eles estão escrevendo para um tty, para que eles não armazenem em buffer.

    
por 10.07.2011 / 23:02
0

Estou criando um wrapper de monitoramento em tempo real em torno do tcpdump que precisa ver os pacotes assim que eles estiverem disponíveis. Mesmo com -l , há algum atraso.

tcpdump agora tem --immediate-mode , o que resolveu esse problema para mim. Para fazê-lo funcionar usei-o em conjunto com -l .

Veja esta resposta .

    
por 13.04.2018 / 23:12

Tags