【发布时间】:2019-08-01 04:01:18
【问题描述】:
我是新来的,对 pysnmp 不熟悉,并且无法通过 snmp 从某些 cisco mibs 获取值。我怀疑问题在于将 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. 于 2015 年 5 月 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 的设备进行 snmpwalk:
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 = Gauge32:12374
pysnmp 脚本错误表明它试图在 SNMPv2-SMI 下找到该 oid,但它不在那个 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
【问题讨论】:
-
我想我找到了解决方法。通过 bulkCmd 而不是 getCmd 运行它似乎有效。我将编辑帖子以添加新代码