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

Python 统计特定网络接口上的传入数据包,python,shell,network-programming,packets,Python,Shell,Network Programming,Packets,我想计算一段特定时间(直到执行脚本后5分钟)内网络接口(例如eth0)上传入的数据包数,如何通过shell或python脚本实现?哪个更准确 我知道网络工具,如iptraf,但我希望它通过脚本完成,最好将计算值打印到屏幕上或文件中。检查它使用libpcap,看起来它支持linux/win/mac >>> import pcap >>> for ts, pkt in pcap.pcap(): ... print ts, `pkt` 有人在这里发布了一个

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

我知道网络工具,如iptraf,但我希望它通过脚本完成,最好将计算值打印到屏幕上或文件中。

检查它使用libpcap,看起来它支持linux/win/mac

>>> import pcap
>>> for ts, pkt in pcap.pcap():
...     print ts, `pkt`
有人在这里发布了一个较长的示例脚本:

如果您使用的是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
#/垃圾箱/垃圾箱
###像sudo一样运行这个
###传递IP地址的参数
##$用法:sudo./
#参数
captureTime=300
#捕获数据包X秒
tcpdump-i eth0 dst主机$1>>/dev/null 2>输出&
pid=$!
睡眠$captureTime
杀死$pid
#提取相关数据
猫出|尾-2 |头-1 |切-d”“-f 1
#清理!
退出
shell运行
tcpdump
300秒,然后终止它
tcpdump
将所需的数据输出到
stderr
。这就是将该流重定向到文件(
2>out
)的原因。shell的最后一个命令从
tcpdump
抛出的完整消息中提取我们想要的数据。它需要以
sudo
运行!另外,不要忘记根据需要修改侦听接口


如果还不清楚我为什么要这么做,请告诉我

如果您使用的是Linux内核(我不知道BSD,…内核),那么您可以使用
/sys/class/net/INTERFACE/statistics/rx_packets

capture.sh接口时间(单位:秒)

#!/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

我认为您可以使用
/sys/class/net/eth0/statistics/rx_数据包
。它只包含一个数字,所以您只需检查两次,然后subtract@Duffydake鉴于上述问题,这应该是答案。其他答案虽然有效,但对于请求来说肯定是过分了。
tcpdump-i eth0
也将捕获传出的数据包。您应该添加
ip dst$Ipaddr
或等效项,以确保您只收到了传入的数据包。我想了想,但在编写脚本时错过了它!无论如何,编辑应该会解决这个问题。非常感谢,它对我来说非常有用:-)只有一件事,对于一些生成的流量,它似乎不能正常工作(例如5Gb/s或更高),我没有得到任何准确的值,我如何修复它?@Sina Sh使用内核文件而不是基于libpcap的工具,对于高速连接来说,它更快、更可靠,查看我的答案。这会给我“权限被拒绝”错误,即使我是机器上的root,尝试了“sudo”并得到了“command not found”。。。chmod+x在文件上完成,结果仍然相同,仅供参考,它是Debian 3.16.7I在Debian 3.15.9上试用过,即使是“简单”的用户(不需要root/sudo):
touch capture.sh
nano capture.sh
复制/粘贴脚本,
chmod+x capture.sh
,然后
/capture.sh eth0
。默认情况下,我的rx\U数据包文件权限为
-r--r--