在bash脚本中运行tcpdump



我试图在shell脚本中从tcpdump中获取一些数字并打印该数字。

这是我的脚本

while true
do
{
 b=`tcpdump -n -i eth1 | awk -F'[, ]' '{print $10}'`
echo $b
}
done

当我执行这个脚本时,我得到这个

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes

在shell脚本中捕获tcpdump o/p有什么特别的需要吗?

默认情况下,tcpdump永远运行(或者直到被Control-C或类似的东西中断)。

b=`tcpdump ...`

构造运行直到tcpdump退出…这从来都不是……而将其输出放入$b。如果希望捕获单个数据包的输出,可以使用tcpdump -c1 ...(或-c5捕获5组或类似的组)。或者,您可以让它永远运行,但是使用while read循环一次捕获它的输出一行(尽管您需要使用tcpdump -l来防止过度缓冲):

tcpdump -l -n -i eth1 | awk -F'[, ]' '{print $10}' | while read b; do
    echo $b
done

我不完全确定你的脚本应该做什么,但我看到一些其他的问题。首先,除非您的tcpdump版本比我的版本更加一致,否则打印每个包的第10个以逗号分隔的字段将而不是得到任何有意义的内容。下面是我电脑上的一些输出示例:

00:05:02:ac:54:1e
1282820004:1282820094
90
73487384:73487474
1187212630:1187212720
90
90
host

2120673524

第二,将输出捕获到一个变量中,然后将其打印出来有什么意义?为什么不直接运行命令并让它直接输出呢?最后,由于单词分割和通配符扩展,echo $b可能会使输出乱码(例如,如果$b恰好是"*",它将打印当前目录中的文件列表)。因此,在使用变量时(在本例中为echo "$b")应该双引号。

这个问题已经问了很长时间了,但是实现脚本打算捕获的目标的最简单方法是简单地记录一个pcap,只匹配您感兴趣的数据包;例如,要编写一个pcap文件,其中仅包含设置了ack标志的数据包,并且确认编号在19000到20000之间:

tcpdump -c2500 -iany 'tcp[8:4]>=19000&&tcp[8:4]<=20000&&tcp[13]&16!=0' -Uw./TCP_ACKs.pcap

最新更新