本文介绍了如何在python中检查网络接口上的数据传输?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有一种用于获取给定网络接口IP的套接字方法:

There is a socket method for getting the IP of a given network interface:

import socket
import fcntl
import struct

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

哪个返回以下内容:

>>> get_ip_address('lo')
'127.0.0.1'

>>> get_ip_address('eth0')
'38.113.228.130'

是否存在类似的方法来返回该接口的网络传输?我知道我可以阅读/proc/net/dev,但是我想使用套接字方法.

Is there a similar method to return the network transfer of that interface? I know I can read /proc/net/dev but I'd love a socket method.

推荐答案

轮询以太网接口统计信息的最佳方法是通过SNMP ...

The best way to poll ethernet interface statistics is through SNMP...

  • 似乎您正在使用linux ...如果是,请在安装 snmpd ,在您的/etc/defaults/snmpd 中(确保带有SNMPDOPTS的行如下所示):

  • It looks like you're using linux... if so, load up your snmpd with these options... after installing snmpd, in your /etc/defaults/snmpd (make sure the line with SNMPDOPTS looks like this):

SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux,usmConf,iquery,dlmod,diskio,lmSensors,hr_network,snmpEngine,system_mib,at,interface,ifTable,ipAddressTable,ifXTable,ip,cpu,tcpTable,udpTable,ipSystemStatsTable,ip,snmp_mib,tcp,icmp,udp,proc,memory,snmpNotifyTable,inetNetToMediaTable,ipSystemStatsTable,disk -Lsd -p /var/run/snmpd.pid'

您可能还需要将ro社区更改为public ,并在/etc/snmp/snmpd.conf中设置您的监听接口(如果不在环回上)...

You might also need to change the ro community to public and set your listening interfaces in /etc/snmp/snmpd.conf (if not on the loopback)...

假设您具有可用的snmpd,此时,您可以使用此工具轮询ifHCInBytesifHCOutBytes 中所涉及的接口. ..

Assuming you have a functional snmpd, at this point, you can poll ifHCInBytes and ifHCOutBytes for your interface(s) in question using this...

poll_bytes.py :

from SNMP import v2Manager
import time

def poll_eth0(manager=None):
    # NOTE: 2nd arg to get_index should be a valid ifName value
    in_bytes = manager.get_index('ifHCInOctets', 'eth0')
    out_bytes = manager.get_index('ifHCOutOctets', 'eth0')
    return (time.time(), int(in_bytes), int(out_bytes))

# Prep an SNMP manager object...
mgr = v2Manager('localhost')
mgr.index('ifName')
stats = list()
# Insert condition below, instead of True...
while True:
    stats.append(poll_eth0(mgr))
    print poll_eth0(mgr)
    time.sleep(5)

SNMP.py :

SNMP.py:

from subprocess import Popen, PIPE
import re

class v2Manager(object):
    def __init__(self, addr='127.0.0.1', community='public'):
        self.addr      = addr
        self.community = community
        self._index = dict()

    def bulkwalk(self, oid='ifName'):
        cmd = 'snmpbulkwalk -v 2c -Osq -c %s %s %s' % (self.community,
            self.addr, oid)
        po = Popen(cmd, shell=True, stdout=PIPE, executable='/bin/bash')
        output = po.communicate()[0]
        result = dict()
        for line in re.split(r'\r*\n', output):
            if line.strip()=="":
                continue
            idx, value = re.split(r'\s+', line, 1)
            idx = idx.replace(oid+".", '')
            result[idx] = value
        return result

    def bulkwalk_index(self, oid='ifOutOctets'):
        result = dict()
        if not (self._index==dict()):
            vals = self.bulkwalk(oid=oid)
            for key, val in vals.items():
                idx = self._index.get(key, None)
                if not (idx is None):
                    result[idx] = val
                else:
                    raise ValueError, "Could not find '%s' in the index (%s)" % self.index
        else:
            raise ValueError, "Call the index() method before calling bulkwalk_index()"
        return result

    def get_index(self, oid='ifOutOctets', index=''):
        # This method is horribly inefficient... improvement left as exercise for the reader...
        if index:
            return self.bulkwalk_index().get(index, "<unknown>")
        else:
            raise ValueError, "Please include an index to get"

    def index(self, oid='ifName'):
        self._index = self.bulkwalk(oid=oid)

END NOTES:

  1. SNMP v2c使用明文身份验证.如果您担心安全性/有人在嗅探您的流量,请更改您的社区,并通过源IP地址将查询限制在您的linux计算机上.理想的情况是修改上面的SNMP.py以使用SNMPv3(用于加密敏感数据).大多数人只是使用非公共社区,并通过源IP限制snmp查询.

  1. SNMP v2c uses clear-text authentication. If you are worried about security / someone sniffing your traffic, change your community and restrict queries to your linux machine by source ip address. The perfect world would be to modify the SNMP.py above to use SNMPv3 (which encrypts sensitive data); most people just use a non-public community and restrict snmp queries by source IP.

ifHCInOctetsifHCOutOctets提供有关通过接口传输的字节数的瞬时值.如果您正在寻找数据传输速率,那么当然会涉及一些额外的数学运算.

ifHCInOctets and ifHCOutOctets provide instantaneous values for the number of bytes transferred through the interface. If you are looking for data transfer rate, of course there will be some additional math involved.

这篇关于如何在python中检查网络接口上的数据传输?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-10 01:32