Python通过SNMP获取设备信息

Python中存在一个库:pysnmp,封装了与SNMP协议相关的操作。

本文对pysnmp做一个简单的、流于表面的实践,对其细节暂不作解释。

首先需要安装pysnmp:

pip pysnmp

在使用它的时候,导入这个库:

from pysnmp.hlapi import *

然后,封装一个Snmp类好了。

from pysnmp.hlapi import *

class Snmp:
    def __init__(self, community='dgut'):
        self.engine = SnmpEngine()  # 初始化引擎
        self.communityData = CommunityData(community, mpModel=1)  # 配置团体字
        self.context = ContextData()  # 实例化上下文对象
        # snmp的获取一个oid对应值的操作
        
    @classmethod
    def deal_result(cls, original_res):
        original_str = str(original_res)                    # nextCmd()获取到的是一个对象,将其转化为字符串
        processed_str = original_str.split('=')[1].strip()  # = 后的内容是所需要的,顺便去除前后的空格
        return processed_str
    
    # pysnmp中封装getCmd、nextCmd、bulkCmd
    # 对应SNMP中的get、getNext、getBulk操作
    def get(self, host, oid, port=161):
        target = UdpTransportTarget((host, port))  # 配置目标主机
        req_oid = ObjectType(ObjectIdentity(oid))  # 输入需要获取的对象的oid
        req_g = getCmd(self.engine, self.communityData, target, self.context, req_oid)
        _, _, _, res = next(req_g)
        final_res = self.deal_result(res[0])
        return final_res

接下来就尝试用它来获取一个系统名称sysName。

s = Snmp()
ip = "10.1.1.254"  # 你需要获取信息的设备IP地址
oid = ".1.3.6.1.2.1.1.4.0"  # sysName的OID
sys_name = s.get(ip, oid)
print(sys_name)

需要注意的是,**Snmp.get()**方法只能获取单个值的节点信息,如果想要获取ipAddress之类的一组信息,还需要使用GetNext、GetBulk操作。

以获取ARP缓存表为例,写一个方法

    def get_arp_table(self, host, port=161):
        target = UdpTransportTarget((host, port))  # 配置目标主机、端口
        phy_address_oid = ObjectType(ObjectIdentity('.1.3.6.1.2.1.4.22.1.2'))
        net_address_oid = ObjectType(ObjectIdentity('.1.3.6.1.2.1.4.22.1.3'))
        g = nextCmd(self.engine, self.communityData, target, self.context,
                    phy_address_oid, net_address_oid,  lexicographicMode=False)
        arp_table = []
        for errorIndication, errorStatus, errorIndex, varBinds in g:
            temp = {
                'ipNetToMediaPhysAddress': self.deal_result(varBinds[0]),
                'ipNetToMediaNetsAddress': self.deal_result(varBinds[1])
            }
            arp_table.append(temp)
        return arp_table

如此,一个简单的案例就完成了。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值