7

问题描述:

我只想打印来自 tcpdump[1] 的源地址和目标地址。

有一个可行的解决方案,但相信它可以改进很多。一个捕获 5 个数据包的示例,就像我正在寻找的示例一样:

tcpdump -i eth1 -n -c 5 ip | \
cut -d" " -f3,5 | \
sed -e 's/^\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)\..* \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*$/\1 > \2/'

问题:

这可以以更简单的方式完成吗?性能也是这里的一个问题。

[1] 测试的一部分是否正确定义了 snort home_net,或者我们是否看到 home_net 中未定义流量。


解决方案:

好的,感谢所有回复此问题的人。有两个与答案相关的问题,一个是不同 linux 版本的兼容性,第二个是速度。

这是我做的速度测试的结果。首先是grep版本:

time tcpdump -l -r test.dmp -n ip 2>/dev/null | grep -P -o '([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*? > ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)' | grep -P -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | xargs -n 2 echo >/dev/null

real    0m5.625s
user    0m0.513s
sys     0m4.305s

然后是 sed 版本:

time tcpdump -n -r test.dmp ip | sed -une 's/^.* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..*$/\1 > \3/p' >/dev/null
reading from file test.dmp, link-type EN10MB (Ethernet)

real    0m0.491s
user    0m0.496s
sys     0m0.020s

最快的是 awk 版本:

time tcpdump -l -r test.dmp -n ip | awk '{ print gensub(/(.*)\..*/,"\\1","g",$3), $4, gensub(/(.*)\..*/,"\\1","g",$5) }' >/dev/null
reading from file test.dmp, link-type EN10MB (Ethernet)

real    0m0.093s
user    0m0.111s
sys     0m0.013s

不幸的是,我无法测试它们的兼容性,但是由于 gensub 功能,awk 需要 gnu awk 才能工作。无论如何,这三种解决方案都适用于我测试过的两个平台。:)

4

4 回答 4

9

这是一种使用方法GNU awk

tcpdump -i eth1 -n -c 5 ip | awk '{ print gensub(/(.*)\..*/,"\\1","g",$3), $4, gensub(/(.*)\..*/,"\\1","g",$5) }'
于 2012-11-21T12:51:07.820 回答
2

尝试这个:

 tcpdump -i eth1 -n -c 5 ip 2>/dev/null | sed -r 's/.* ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).* > ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1 > \2/'

如果从 .sh 脚本运行,请记住根据需要转义 \1 和 \2。

于 2012-11-21T12:36:27.870 回答
1

&这里是一个 grep 唯一的解决方案:

tcpdump -l -i eth1 -n -c 5 ip 2>/dev/null | grep -P -o '([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*? > ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)' | grep -P -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | xargs -n 2 echo

请注意-l,如果您不想限制使用-c.

于 2012-11-21T13:59:07.797 回答
1

警告您必须使用无缓冲行缓冲输出来监视另一个命令的输出,例如tcpdump.

但是您的命令似乎是正确的。

为简化起见,您可以:

tcpdump -i eth1 -n -c 5 ip | 
  sed -une 's/^.* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..*$/\1 > \3/p'

注意在u-c 5没有tcpdump的情况下有用的开关

tcpdump -ni eth1 ip | 
  sed -une 's/^.* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..*$/\1 > \3/p'
于 2012-11-21T13:51:22.907 回答