合并各种 SNMP 事务并将每个事务的 OID 和结果分配给唯一变量以进行进一步处理

Consolidating various SNMP transactions and assigning the OID and result of each to unique variables for further processing

我正在尝试编写包含许多 SNMP 事务的代码,一些事务可以捆绑到 PySNMP 的相同 getCmd() 函数中。话虽如此,我不打算立即打印我的 SNMP 事务的结果值,有时需要进一步处理。 I.E:开箱。捆绑两个 SNMP 事务如下所示:

from pysnmp.hlapi import *

errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData('somePasswd'),
           UdpTransportTarget(('somedev.example.com', 161)),
           ContextData(),
           #One MIB
           ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', '0')),
           #Second MIB
           ObjectType(ObjectIdentity('CISCO-CDP-MIB', 'cdpCacheAddress', 1,1)),
           lookupNames=True,
           lookupValues=True,
))

if errorIndication:
    print(errorIndication)
elif errorStatus:
    print('%s at %s' % (errorStatus.prettyPrint(),
                        errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
    for varBind in varBinds:
        print(' = '.join([x.prettyPrint() for x in varBind]))

如果我想将特定 MIB 的值分配给变量,我的看法是,我必须在最后一个 for 循环下放置一个 if..elseif 语句来比较 MIB 的值我正在寻找 oid 可迭代对象的当前值(我认为是术语)。所以,我的代码会像这样改变:

for oid, value in varBinds:
    if oid == 'SNMPv2-MIB::sysName.0':
        #take specific actions
    elif oid == 'CISCO-CDP-MIB::cdpCacheAddress.1.1'
        #take different actions

我认为这可能是一种做事方式,但是,我有几个问题:

  1. 这是处理多个 SNMP 事务的有效方法吗?

  2. 将每个 SNMP Get 事务分开对代码的易读性是否更好?

  3. 当我执行以下操作时,我的 OID 将转换为人性化的, MIBS:

        for varBind in varBinds
                print(' = '.join([x.prettyPrint() for x in varBind]))
    

但以下只是给我丑陋的 oids:

     for oid, value in varBinds:
             print("oid:",oid,"Value",value):

通过将 oid 和值传递给我的 for 循环,我如何以 人性化的 mib 而不是丑陋的 oid?

更新:

.loadMibs传递给ObjectIdentity,像这样:ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', '0').loadMibs('SNMPv2-MIB'))在打印oidvalue时仍然给了我一个OID,像这样:for oid, value in varBinds:

我认为一次拉取两个托管对象(这是 SNMP 的说法)是正确的做法。这是通过高级 SNMP API.

获取数据的最有效方式

一旦您得到两个托管对象作为响应,您就可以遍历它们并采取相应的行动 - 这就是您的代码似乎要做的。我个人认为那里没有任何问题。

要根据 MIB 解析收到的变量绑定(代表 SNMP 管理的对象),您只需对它们调用 .prettyPrint()

for oid, value in varBinds:
    print("Name: ", oid.prettyPrint(), "Value: ", value.prettyPrint()):

如果你想根据 OID 值来分支处理,最有效的方法是比较那些丑陋的 OID:

for oid, value in varBinds:
    if oid == (1, 3, 6, 1, 2, 1, 1, 5, 0):  # 'SNMPv2-MIB::sysName.0':
        #take specific actions