はここに私のsnmpbulkwalk実装です(例からそれを取った):タイムアウトながら
def bulk_walk(self, oid, context, conv):
walkdone = False
data = list()
if context:
community = "%[email protected]%s" % (self.community, context)
else:
community = self.community
for errorIndication, \
errorStatus, errorIndex, \
varBinds in bulkCmd(SnmpEngine(),
CommunityData(community),
UdpTransportTarget((self.ip, self.port)),
ContextData(), 0, 10,
ObjectType(ObjectIdentity(oid)), lookupMib=False):
if errorIndication:
raise(SNMPError(errorIndication))
elif errorStatus:
raise(SNMPError('%s at %s' % (
errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex)-1][0] or '?'
))
)
else:
for varBind in varBinds:
print(varBind[0].prettyPrint(), conv(varBind[1]))
if not varBind[0].prettyPrint().startswith(oid+"."):
walkdone = True
break
data.append((varBind[0].prettyPrint(), conv(varBind[1])))
if walkdone:
break
return(data)
私は取得していますsnmpbulkwalkでそれをやろうとしたとき、私は、存在しないOIDをsnmpwalkをしようとしています:私たちはtcpdumpのを見れば1 10.253.35.61 1.3.6.1.2.1.17.4.3.1.1
SNMPv2-SMI::mib-2.17.4.3.1.1 = No Such Instance currently exists at this OID
は、我々はこれを見ることができます@
$のsnmpwalk -c -v2c公共:
okです11:26:00.460905 IP host.52491 > 10.253.35.61.snmp: [email protected] GetBulk(30) N=0 M=10 17.4.3.1.1
11:26:01.462162 IP host.52491 > 10.253.35.61.snmp: [email protected] GetBulk(30) N=0 M=10 17.4.3.1.1
11:26:01.658323 IP 10.253.35.61.snmp > host.52491: [email protected] GetResponse(215) 17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500
11:26:01.658561 IP host.52491 > 10.253.35.61.snmp: [email protected] GetRequest(30) 17.4.3.1.1
11:26:01.659643 IP 10.253.35.61.snmp > host.52491: [email protected] GetResponse(215) 17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500
11:26:01.660698 IP 10.253.35.61.snmp > host.52491: [email protected] GetResponse(30) 17.4.3.1.1=[noSuchInstance]
、私はその周りに誤りや作品を見ることができますが、私はpysnmpからそれを照会すると - エラー「いいえSNMP応答がタイムアウトする前に受信しない」になって、ここでのtcpdumpでいます:
11:26:58.497144 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1
11:26:59.499136 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1
11:27:00.480834 IP 10.253.35.61.snmp > host.54615: [email protected] GetResponse(542) 17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500 17.4.4.1.2.4136=1500 17.4.4.1.2.4137=1500 17.4.4.1.3.1414=14191348 17.4.4.1.3.4103=371017501 17.4.4.1.3.4104=43993868 17.4.4.1.3.4115=379731251 17.4.4.1.3.4136=2614818874 17.4.4.1.3.4137=3830362616 17.4.4.1.4.1414=390518443 17.4.4.1.4.4103=547088805 17.4.4.1.4.4104=270695068 17.4.4.1.4.4115=2723143051 17.4.4.1.4.4136=2811735791 17.4.4.1.4.4137=102796762 17.4.4.1.5.1414=0
11:27:00.503200 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1
11:27:01.505277 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1
11:27:02.469848 IP 10.253.35.61.snmp > host.54615: [email protected] GetResponse(542) 17.4.4.1.1.1414=1414 17.4.4.1.1.4103=4103 17.4.4.1.1.4104=4104 17.4.4.1.1.4115=4115 17.4.4.1.1.4136=4136 17.4.4.1.1.4137=4137 17.4.4.1.2.1414=1500 17.4.4.1.2.4103=1500 17.4.4.1.2.4104=1500 17.4.4.1.2.4115=1500 17.4.4.1.2.4136=1500 17.4.4.1.2.4137=1500 17.4.4.1.3.1414=14191348 17.4.4.1.3.4103=371017846 17.4.4.1.3.4104=43994108 17.4.4.1.3.4115=380963114 17.4.4.1.3.4136=2616771624 17.4.4.1.3.4137=3830710704 17.4.4.1.4.1414=390519877 17.4.4.1.4.4103=547090599 17.4.4.1.4.4104=270696594 17.4.4.1.4.4115=2724485940 17.4.4.1.4.4136=2813399966 17.4.4.1.4.4137=102954755 17.4.4.1.5.1414=0
11:27:02.987802 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1
11:27:03.989765 IP host.54615 > 10.253.35.61.snmp: [email protected] GetBulk(29) N=0 M=25 17.4.3.1.1
これは悪いですが、タイムアウト(ホストダウン、間違ったコミュニティ文字列など)を引き起こす可能性のあるシナリオがある可能性があるため、pnmnmpでsnmpbulkwalkの動作をエミュレートできます。
ありがとうございます。
これは、最初のタイムアウト後にGetBulkからGetResponseに切り替わるsnmpbulkwalkです。 pysnmpはタイムアウトまでGetBulkを続行します。 –
GETとGETBULKは異なるコマンドであり、SNMPはそれらを一緒に使用するようには要求しません。 snmpbulkwalkをエミュレートしたい場合は、PythonスクリプトがbulkCmd()と一緒にgetCmd()を呼び出すようにすることができます。元の問題に対処するために、pysnmpはタイムアウトとno-such-oidエラー状態を混在させません。ライブラリは、エラーが発生したかどうかを報告し、エラーをマスクしたり置換したりしません。 –