我想知道如何在pysnmp中获取某个网络设备的所有oid 这是我的代码:
errorIndication, errorStatus, errorIndex, varBind = cmdGen.nextCmd(
cmdgen.CommunityData('public'),
cmdgen.UdpTransportTarget((ip, 161)),
cmdgen.MibVariable('IF-MIB', '').loadMibs(), #get all oids
lexicographicMode=True, maxRows=10000,
ignoreNonIncreasingOid=True
)
for varBindTableRow in varBind:
for name, val in varBindTableRow:
print name, val
print(len(varBind)) #prints number of oids
问题是我从未获得设备的所有oid(实际上甚至没有关闭)
使用这个代码我通常会得到90左右但是当我使用snmpWalk.exe(从互联网上下载)时,我每次通常会得到700个。
我试过用很多方法重写我的代码,但没有任何作用
有人可以告诉我如何使用pysnmp获取网络设备的所有oid?
答案 0 :(得分:0)
您的代码应该从IF-MIB的第一个OID开始,最多可以获得10000个OID。尝试从第一个OID开始走你的代理,并确保在行走方式上没有间歇性错误。
另外,请记住,您的pysnmp代码使用SNMP v2c。我不确定您使用snmpwalk.exe的SNMP版本。尽管不太可能,但理论上您的SNMP代理可能会对SNMP v1和v2c查询做出不同的响应。我认为两种情况下SNMP社区是相同的。
如果没有任何帮助,请尝试启用pysnmp调试以查看请求了哪些OID,返回了哪些OID以及pysnmp是否以及为何过早停止:
from pysnmp import debug
debug.setLogger(debug.Debug('msgproc', 'dsp', 'io', 'app'))
errorIndication, errorStatus, errorIndex, varBind = cmdGen.nextCmd(
cmdgen.CommunityData('public'),
cmdgen.UdpTransportTarget((ip, 161)),
'1.3.6',
lexicographicMode=True,
ignoreNonIncreasingOid=True
)
# make sure there's no timeout or other errors occurring at some point
if errorIndication:
print('WARNING: %s' % errorIndication)
for varBindTableRow in varBind:
for name, val in varBindTableRow:
print(name, val)
print(len(varBind)) #prints number of oids