it-swarm-es.com

¿Cómo iniciar y eliminar tcpdump dentro de un script?

¿Por qué no puedo interrumpir (es decir, kill -2, notkill -9) tcpdump como se muestra en este script? El script se ejecuta, pero tcpdump no finaliza y continúa ejecutándose en la línea de comando, incluso después de imprimir parte de su salida.

(Nota: este script requiere Sudo debido a tcpdump y kill).

#!/bin/bash  

#start a process in the background (it happens to be a TCP HTTP sniffer on  the loopback interface, for my Apache server):   

tcpdump -i lo -w dump.pcap 'port 80' &  

#.....other commands that send packets to tcpdump.....

#now interrupt the process.  get its PID:  
pid=$(ps -e | pgrep tcpdump)  
echo $pid  

#interrupt it:  
kill -2 $pid
2
quest

Encontré parte de la respuesta en esta publicación de Stack Overflow .

Para resumir, tcpdump estaba almacenando en búfer su salida antes de escribir en el archivo de salida, y esto causó problemas cuando el script intentó interrumpirlo. Agregar la opción -U ("flush") a tcpdump corrige esto.

También era necesario un comando sleep inmediatamente después de emitir tcpdump para permitir que se inicialice, y también antes de eliminarlo, para que pueda escribir en el archivo:

#!/bin/bash  

#start a process in the background (it happens to be a TCP HTTP sniffer on  the loopback interface, for my Apache server):   

tcpdump -U -i lo -w dump.pcap 'port 80' &   
sleep 5

#.....other commands that send packets to tcpdump.....

#now interrupt the process.  get its PID:  
pid=$(ps -e | pgrep tcpdump)  
echo $pid  

#interrupt it:  
sleep 5
kill -2 $pid

Como referencia, desde man tcpdump, bajo la opción -U:

If  the -w option is specified, make the saved raw packet output 
``packet-buffered''; i.e., as each packet is saved,
it will be written to the output file, rather than being written only
 when the output buffer fills.

Después de esto, el guión funcionó bien.

1
quest