【问题标题】:Count incoming packets on specific network interface计算特定网络接口上的传入数据包
【发布时间】:2016-03-17 20:44:05
【问题描述】:

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

我知道诸如 iptraf 之类的网络工具,但我希望通过脚本来完成,最好将计数值打印在屏幕上或打印到文件中。

【问题讨论】:

  • 我认为你可以使用 /sys/class/net/eth0/statistics/rx_packets 。它只包含一个数字,所以你只需要检查两次并减去
  • @Duffydake 鉴于上述问题,这应该是答案。其他答案虽然有效,但对于请求来说肯定是多余的。

标签: python shell network-programming packets


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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 运行tcpdump300 秒并终止它。 tcpdump 将您需要的数据输出到stderr。这就是将该流重定向到文件 (2&gt; out) 的原因。 shell 的最后一秒命令从tcpdump 抛出的完整消息中提取我们想要的数据。它需要以sudo 运行!也不要忘记根据需要修改监听接口。

    如果我仍然不清楚我为什么做了我所做的事情,请告诉我!

    【讨论】:

    • tcpdump -i eth0 也会捕获传出的数据包。您应该添加 ip dst $Ipaddr 或等效项以确保您只收到传入的数据包
    • 是的,我想过,但是在写剧本的时候错过了!无论如何,编辑应该是问题。
    • 非常感谢,它对我来说就像一个魅力 :-) 只有一件事,对于某些生成的流量,它似乎无法正常工作(例如 5Gb/s 或更高)我没有得到任何准确的值,我该如何解决?
    • @Sina Sh 使用内核文件代替基于 libpcap 的工具,高速连接更快更可靠,看我的回答。
    【解决方案3】:

    如果你使用的是 Linux Kernel,你可以使用/sys/class/net/INTERFACE/statistics/rx_packets(我不知道 BSD,... 内核)

    capture.sh 接口 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
    

    【讨论】:

    • 这给了我“权限被拒绝”错误,即使我是机器上的根,尝试“sudo”并得到“找不到命令”... chmod +x 在文件,结果还是一样,
    • 仅供参考,它是 Debian 3.16.7
    • 我在 debian 3.15.9 上尝试过,即使使用“简单”用户(不需要 root/sudo)也能正常工作:touch capture.shnano capture.sh 复制/粘贴脚本,@ 987654326@ 然后 ./capture.sh eth0 10 。我的 rx_packets 文件权限默认为-r--r--r--
    猜你喜欢
    • 2012-08-07
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2011-04-17
    • 2020-10-02
    相关资源
    最近更新 更多