web-dev-qa-db-ja.com

スクリプト内でtcpdumpを開始および終了する方法は?

このスクリプトに示されているように、割り込みできない(つまり、kill -2notkill -9tcpdumpスクリプトは実行されますが、tcpdumpは終了せず、終了出力の一部を出力した後でもコマンドラインで実行を続けます。

(注:Sudoおよびtcpdumpにより、このスクリプトには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

私は答えの一部を見つけました このStack Overflowの投稿で

要約すると、tcpdumpは出力ファイルに書き込む前に出力をバッファリングしていたため、スクリプトがそれを中断しようとしたときに問題が発生しました。 -U( "flush")オプションをtcpdumpに追加すると、これが修正されます。

また、sleepを発行してすぐに初期化できるようにするtcpdumpコマンドが必要であり、ファイルへの書き込みを許可するために、それを強制終了する前にも必要でした。

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

参照用に、man tcpdumpから、-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.

この後、スクリプトは正常に機能しました。

1
quest