如何在脚本中启动和终止 tcpdump?

如何在脚本中启动和终止 tcpdump?

为什么我不能打断(例如kill -2不是 kill -9)tcpdump如该脚本所示?脚本运行,但tcpdump不会终止,并继续在命令行运行,即使在打印了部分退出输出之后也是如此。

(注意:此脚本需要sudo由于tcpdumpkill)。

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

答案1

我找到了部分答案在这篇 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.

此后,脚本运行良好。

答案2

until [ $x -gt 13 ];
do tcpdump -i $1 -w /home/paul/chanscan/chan-$x-$now.pcapng -e -s 0 subtype probe-req or subtype probe-resp -v & sleep 10; 
sleep 2;

这里直接用less代码杀一下:

kill $(ps -e | pgrep tcpdump);

如您所见,我没有使用其他变量,而是在 10 秒休眠 2 秒后终止了该进程。我编写的脚本包含对 1-13 之间的每个通道进行 10 秒扫描,这是为了探测请求和响应,因此,终止 tcpdump 运行进程对于开始下一次扫描至关重要。

我总是给大约 2 秒钟的时间来使用 kill 或切换频道等。上面的答案都同样好,只是想向您展示一个简化的答案,它可以用更少的代码满足所有需求。希望这对某人有所帮助。:-)

答案3

您可以输入以下命令:

killall tcpdump

如果您正在连续运行 tcpdump 并想结束该进程,则这很重要。其他任何事情都不会受到影响。

相关内容