我只是这里的新手,还是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
答案 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以获得更多提示(如果有的话),并将其反映在您的应用程序代码中。