Cómo procesar / canalizar la salida de TCPDUMP en tiempo real

27

Si quiero tcpdump solicitudes DNS de clientes (en un enrutador OpenWrt 10.04), entonces yo

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

Eso está completamente bien. Pero. ¿Por qué no puedo canalizar la salida de tcpdumps en tiempo real?

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

Si hago awk, etc. después de tcpdump, no obtengo NINGUNA salida ¿Porqué es eso? ¿Por qué no puedo procesar la salida de tcpdump con canalización en tiempo real? (de modo que, por ejemplo, en el ejemplo solo se muestra la tercera columna)

¿Hay alguna solución para esto?

LanceBaynes
fuente

Respuestas:

35

Directamente 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.
Marcin
fuente
7

Use la opción -Uen combinación con -wpara que tcpdump escriba paquetes inmediatamente.

Julius Junghans
fuente
3

El tcpdump aparentemente está almacenando el búfer cuando escribe en una tubería. No está descargando la salida para cada escritura, por lo que el sistema escribirá la salida en aproximadamente 4k bytes. Su filtro está limitando la salida, por lo que no verá nada hasta que el filtro haya escrito suficiente salida. Una vez que se recolecta lo suficiente, se escribirá en un fragmento y entonces debería ver varias líneas emitidas.

Intente activar las búsquedas de DNS muchas veces y vea qué sucede entonces.

Keith
fuente
1

expecttiene un unbuffercomando para engañar a los comandos para que asuman que están escribiendo en un tty, por lo que no se almacenan en el búfer.

ninjalj
fuente
1

Estoy construyendo un contenedor de monitoreo en tiempo real alrededor de tcpdump que necesita ver los paquetes tan pronto como estén disponibles. Incluso con -lalguna demora.

tcpdump ahora tiene --immediate-mode, lo que resolvió este problema para mí. Para que funcione, lo usé junto con -l.

Mira esta respuesta .

Anderspitman
fuente