![如何在脚本中启动和终止 tcpdump?](https://linux22.com/image/988709/%E5%A6%82%E4%BD%95%E5%9C%A8%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%90%AF%E5%8A%A8%E5%92%8C%E7%BB%88%E6%AD%A2%20tcpdump%EF%BC%9F.png)
为什么我不能打断(例如kill -2
,不是 kill -9
)tcpdump
如该脚本所示?脚本运行,但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
答案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 并想结束该进程,则这很重要。其他任何事情都不会受到影响。