如何解决“此OID当前不存在此类实例”

时间:2019-08-01 04:01:18

标签: python pysnmp

我只是这里的新手,还是pysnmp的新手,在通过snmp从某些思科mib获取值时遇到了麻烦。我怀疑问题出在将MIB加载到pysnmp中。如何告诉pysnmp将其查询定向到特定的MIB?

我已经在pysnmp网站上关注了这些示例,并且可以检索提供的示例中使用的OID。

我在Windows 2012服务器上使用python3。

这是pysnmp网站上SNMPv2-MIB的示例,并且可以运行。

def snmp_get(ip, community):
    errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData(community),
           UdpTransportTarget((ip, 161), timeout=1.0, retries=0),
           ContextData(),
           ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'))
           )
    )

    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]))

    return

运行时返回以下内容:

  

SNMPv2-MIB :: sysDescr.0 = Cisco IOS软件,C800软件   (C800-UNIVERSALK9-M)版本15.4(3)M3,发布软件(fc2)   技术支持:http://www.cisco.com/techsupport版权所有(c)   1986-2015年,由Cisco Systems,Inc.编制,星期五15年6月5日16:04   prod_rel_team

我正在尝试使用CISCO-WAN-3G-MIB检索一堆OID,其中一个用于c3gGsmLac,即.1.3.6.1.4.1.9.9.661.1.3.2.1.1

当我用此OID替换ObjectIdentity时,出现以下错误:

  

SNMPv2-SMI :: enterprises.9.9.661.1.3.2.1.1 =当前没有此类实例   存在于此OID。

这是我迷路的地方,因为我知道该实例存在。 我可以通过net-snmp手动窥探设备以获取相同的OID:

  

c:\ sanitised> snmpwalk -v 2c -c snmpcommunity 1.1.1.1   .1.3.6.1.4.1.9.9.661 .1.3.2.1.1 CISCO-WAN-3G-MIB :: c3gGsmLac.13 =   仪表32:12374

pysnmp脚本错误表明它正在尝试在SNMPv2-SMI下找到该oid,但不在该版本下,而是在CISCO-WAN-3G-MIB下。

如何告诉pysnmp在其他MIB下查看?

我已经尝试根据我在文档中找到的一些代码进行指定:

ObjectType(ObjectIdentity('CISCO-WAN-3G-MIB', 'c3gGsmLac', 13))

,这也有效,返回以下输出:

  

CISCO-WAN-3G-MIB :: c3gGsmLac.13 = 12374

但这并不是真正的解决方案,因为数字13并不总是数字13。它可能因设备而异,我事先也不知道它是多少。

我尝试将MIB编译为.py文件,并将其存储在我的C:\ Program Files \ Python37 \ Lib \ site-packages \ pysnmp_mibs \目录中,但未执行任何操作。我还尝试将它们复制到我的MIBDIRS环境变量路径中,但是也没有显示任何变化,我仍然会收到错误消息。

有人可以告诉我如何告诉pysnmp在CISCO-WAN-3G-MIB中查找c3gGsmLac吗?还是如何使其仅响应“ .1.3.6.1.4.1.9.9.661.1.3.2.1.1”表示形式?

谢谢

编辑:以下似乎可行:

def snmp_get(ip, community):      
    for (errorIndication,
     errorStatus,
     errorIndex,
     varBinds) in bulkCmd(SnmpEngine(),
                          CommunityData(community),
                          UdpTransportTarget((ip, 161)),
                          ContextData(),
                          0, 50,
                          ObjectType(ObjectIdentity('CISCO-WAN-3G-MIB', 'c3gGsmLac')),
                          ObjectType(ObjectIdentity('CISCO-WAN-3G-MIB', 'c3gGsmCurrentCellId')),
                          lexicographicMode=False):

        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]))

    return

1 个答案:

答案 0 :(得分:0)

要回答您的问题:

  

SNMPv2-SMI :: enterprises.9.9.661.1.3.2.1.1 =此OID当前不存在此类实例。

此错误应该来自您的代理。可能是您缺少标识受管对象实例的OID的尾部。

  

如何告诉pysnmp在其他MIB下查看?

您需要pre-load包含您的代理将响应的对象的MIB。

  

我已经尝试根据我在文档中找到的一些代码进行指定:

这有效地加载了该MIB。

  

但这并不是真正的解决方案,因为数字13并不总是数字13。它可能因设备而异,我事先也不知道它是多少。

好吧,看来您正在获取MIB表对象。根据该表的性质,索引(例如13)可以来去去并且可以不同。通常在MIB本身(DESCRIPTION子句)中描述确切的行为。

我认为SNMP本身没有任何东西可以让您可靠地枚举这些对象。事实是它们只是底层系统资源的视图。例如,它可能是磁盘驱动器或网络接口。随着时间的推移,它们的存在和名称可能会非常不稳定。

为减轻这种情况,SNMP具有GETNEXT / GETBULK命令,可让您发现此刻实际存在的内容。

我建议阅读MIB以获得更多提示(如果有的话),并将其反映在您的应用程序代码中。