我试图在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