问题描述:
我想只打印来自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-version:
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-version:
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才能工作。无论如何,这三个解决方案都适用于我测试过的两个平台。 :)
答案 0 :(得分:8)
这是使用GNU awk
的一种方式:
tcpdump -i eth1 -n -c 5 ip | awk '{ print gensub(/(.*)\..*/,"\\1","g",$3), $4, gensub(/(.*)\..*/,"\\1","g",$5) }'
答案 1 :(得分: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根据需要。
答案 2 :(得分:1)
警告您必须使用无缓冲 ou 行缓冲输出来监控其他命令的输出,例如tcpdump
。< / p>
但你的命令似乎是正确的。
为简化起见,您可以:
tcpdump -i eth1 -n -c 5 ip |
sed -une 's/^.* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..* \(\([0-9]\{1,3\}\.\?\)\{4\}\)\..*$/\1 > \3/p'
请注意,在tcpdump
处没有u
的{{1}}开关有用
-c 5
答案 3 :(得分: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
限制数据包数量。