回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在使用<code>GetNext</code>操作中的一个示例来进行树的SNMPWalk。我使用异步变量来收集OID-</p>
<pre><code># GETNEXT Command Generator
from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.proto import rfc1902
# ( ( authData, transportTarget, varNames ), ... )
targets = (
# 1-st target (SNMPv1)
( cmdgen.CommunityData('test-agent-1', 'public'),
cmdgen.UdpTransportTarget(('localhost', 161)),
(rfc1902.ObjectName((1,3,6,1,2,1)), rfc1902.ObjectName((1,3,6,1,3,1)))),
# 2-nd target (SNMPv2c)
( cmdgen.CommunityData('test-agent-2', 'public', 1),
cmdgen.UdpTransportTarget(('localhost', 161)),
(rfc1902.ObjectName((1,3,6,1,2,1,2)),) ),
)
def cbFun(
sendRequestHandle, errorIndication, errorStatus, errorIndex,
varBindTable, (varBindHead, authData, transportTarget)
):
if errorIndication:
print 'SNMP engine error', errorIndication
return 1
if errorStatus:
print 'SNMP error %s at %s' % (errorStatus, errorIndex)
return 1
varBindTableRow = varBindTable[-1]
for idx in range(len(varBindTableRow)):
name, val = varBindTableRow[idx]
if val is not None and varBindHead[idx].isPrefixOf(name):
# still in table
break
else:
print 'went out of table at %s' % (name, )
return
for varBindRow in varBindTable:
for oid, val in varBindRow:
if val is None:
print oid.prettyPrint()
else:
print '%s = %s' % (oid.prettyPrint(), val.prettyPrint())
return 1 # continue table retrieval
cmdGen = cmdgen.CommandGenerator()
for authData, transportTarget, varNames in targets:
cmdGen.asyncNextCmd(
authData, transportTarget, varNames,
# User-space callback function and its context
(cbFun, (varNames, authData, transportTarget))
)
cmdGen.snmpEngine.transportDispatcher.runDispatcher()
</code></pre>
<p>我得到了我需要的OID;但是当它从表中输出并从cbFun返回时,最后一行中的调度器抛出一个错误,我无法解决,输出看起来像-</p>
^{pr2}$