在bash脚本中运行tcpdump

时间:2014-03-13 05:02:26

标签: bash

我试图从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有什么特别之处吗?

2 个答案:

答案 0 :(得分:2)

默认情况下,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")。

答案 1 :(得分:0)

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

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