web-dev-qa-db-fra.com

Comment démarrer et tuer tcpdump dans un script?

Pourquoi ne puis-je pas interrompre (c'est-à-dire kill -2, paskill -9) tcpdump comme indiqué dans ce script? Le script s'exécute, mais tcpdump ne se termine pas et continue de s'exécuter sur la ligne de commande, même après avoir imprimé une partie de sa sortie.

(Remarque: ce script nécessite Sudo en raison de tcpdump et 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

J'ai trouvé une partie de la réponse sur ce post Stack Overflow .

Pour résumer, tcpdump mettait sa sortie en mémoire tampon avant d'écrire dans le fichier de sortie, ce qui posait problème lorsque le script tentait de l'interrompre. L'ajout de l'option -U ("flush") à tcpdump résout ce problème.

Il fallait également une commande sleep immédiatement après avoir lancé tcpdump pour lui permettre de s'initialiser, et également avant de le tuer, pour lui permettre d'écrire dans le fichier:

#!/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

Pour référence, à partir de man tcpdump, sous l'option -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.

Après cela, le script a bien fonctionné.

1
quest