首先,我是Python和PySNMP的新手。我试图将一个网络设备列表传递给bulkCmd,以获取所有物理接口的信息。
目前它只收集第一个接口,然后转到列表中的下一个网络设备。我已经使用lexicographic和maxCalls进行了更改,重复但没有任何区别。
在将单个bulkCmd发送到单个网络设备时,我已成功轮询所有接口。
代码:
from pysnmp.hlapi import *
routers = ["router1", "router2"]
#adds routers to getCmd and bulkCmd
def snmpquery (hostip):
errorIndication, errorStatus, errorIndex, varBinds = next (
bulkCmd(SnmpEngine(),
CommunityData('communitystring'),
UdpTransportTarget((hostip, 161)),
ContextData(),
0, 50,
ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')),
ObjectType(ObjectIdentity('IF-MIB', 'ifAlias')),
ObjectType(ObjectIdentity('IF-MIB', 'ifOperStatus')),
lexicographicMode=True
)
)
# Check for errors and print out results
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]))
# calls snmpquery for all routers in list
for router in routers:
snmpquery(router)
输出:
IF-MIB::ifDescr.1 = GigabitEthernet0/0
IF-MIB::ifAlias.1 = InterfaceDesc
IF-MIB::ifOperStatus.1 = 'up'
IF-MIB::ifDescr.1 = GigabitEthernet0/0
IF-MIB::ifAlias.1 = InterfaceDesc
IF-MIB::ifOperStatus.1 = 'up'
答案 0 :(得分:0)
bulkSNMP
返回一个迭代器,你在它上面使用next()
,它只检索第一次迭代。你可能从PySNMP documentation得到了这个想法,它没有很好地展示如何检索所有结果。
您应该使用for循环遍历所有迭代,如下所示:
from pysnmp.hlapi import *
routers = ["router1", "router2"]
def snmpquery (hostip):
snmp_iter = bulkCmd(SnmpEngine(),
CommunityData('communitystring'),
UdpTransportTarget((hostip, 161)),
ContextData(),
0, 50,
ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')),
ObjectType(ObjectIdentity('IF-MIB', 'ifAlias')),
ObjectType(ObjectIdentity('IF-MIB', 'ifOperStatus')),
lexicographicMode=True)
for errorIndication, errorStatus, errorIndex, varBinds in snmp_iter:
# Check for errors and print out results
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]))
# calls snmpquery for all routers in list
for router in routers:
snmpquery(router)
另外,在发布与Python相关的问题时要小心缩进,因为它很重要。
答案 1 :(得分:0)
您需要迭代bulkCmd
函数生成的生成器,重复SNMP查询以提取不适合以前响应数据包的SNMP管理对象。只需抛弃next()
来电,然后for
循环bulkCmd()
。
附注1:如果要获取位于MIB表列下的托管对象(例如lexicographicMode=True
等),则可能不需要IF-MIB::ifDescr
。
附注2:如果您的网络上有许多SNMP代理,您可以考虑通过与in parallel交谈来加快数据检索过程。您使用相同的getBulk()
调用,它只是执行并行性的底层网络I / O.