计算特定网络接口上的传入数据包

时间:2015-12-11 20:24:13

标签: python shell network-programming packets

我想计算一段特定时间内(在执行脚本后5分钟)网络接口(例如eth0)上的传入数据包的数量,我该如何通过shell或python脚本来实现?哪一个更准确?

我知道网络工具,例如iptraf,但我希望它可以通过脚本完成,最好是在屏幕上或文件中打印计数值。

3 个答案:

答案 0 :(得分:2)

查看https://github.com/dugsong/pypcap它使用了libpcap,看起来它支持linux / win / mac

>>> import pcap
>>> for ts, pkt in pcap.pcap():
...     print ts, `pkt`

有人在这里发布了一个更长的示例脚本: http://pylibpcap.sourceforge.net

答案 1 :(得分:2)

如果您正在使用linux shell,则可以使用tcpdump来完成工作。 shell中使用的大多数命令都预先安装在大多数Linux发行版中。

#!/bin/sh
# # # Run this as sudo
# # # Pass an argument of your IP address
# # $ Usage: sudo ./<nameOfTheScript> <IPofYourMachine>
# Parameters
captureTime=300


# Capture packets for X Seconds
tcpdump -i eth0 dst host $1 >> /dev/null 2> out &
pid=$!
sleep $captureTime
kill $pid

# Extract relevant data
cat out | tail -2 | head -1 | cut -d " " -f 1

# Cleaning up!
rm out

shell运行tcpdump 300秒并终止它。 tcpdump会将您需要的数据输出到stderr。这就是将该流重定向到文件(2> out)的原因。 shell的最后一秒命令从tcpdump抛出的完整消息中提取我们想要的数据。它需要以sudo运行!另外,请不要忘记根据需要修改监听界面。

如果我还不清楚为什么我做了我做过的事情,请告诉我!

答案 2 :(得分:2)

如果您使用的是Linux内核(我不了解BSD,......内核),您可以使用/sys/class/net/INTERFACE/statistics/rx_packets

capture.sh interface time_in_seconds

#!/bin/sh
pcksFile="/sys/class/net/$1/statistics/rx_packets"
nbPcks=`cat $pcksFile`
sleep $2
echo $(expr `cat $pcksFile` - $nbPcks)

输出:

$ ./capture.sh eth0 2
7