gpt4 book ai didi

python - 如果使用 SNMPv1 找不到其中之一,Pysnmp 无法获取多个 oid

转载 作者:行者123 更新时间:2023-11-30 23:07:15 26 4
gpt4 key购买 nike

当我使用 pysnmp 并尝试在一个 getCmd 命令中获取多个 oid 时,但其中一个 oid 不存在,那么我无法接收任何 oid 的值,除非我使用 SNMPv2 或 SNMPv3(更改 mpmodel 中的 mpmodel)代码)

from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.smi import builder, view, error

def cbFun_OID(sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx):
(authData, transportTarget) = cbCtx
for oid, val in varBinds:
print val.prettyPrint()
ip='192.168.0.101'
cmdGen = cmdgen.AsynCommandGenerator()
cmdGen.getCmd(
cmdgen.CommunityData('public', mpModel=0),
cmdgen.UdpTransportTarget((ip, 161)),
((1,3,6,1,2,1,43,10,2,1,4,1,1),(1,3,6,1,2,1,43,5,1,1,1,1,123456)),
(cbFun_OID, (cmdgen.CommunityData('public', mpModel=0), cmdgen.UdpTransportTarget((ip, 161)))))
cmdGen.snmpEngine.transportDispatcher.runDispatcher()

如果两个 oid 都存在,我会得到两个值。
如果至少有一个 oid 不存在,则所有值都将为“此 OID 当前不存在此类对象”。
我可以使用 asyncGetCmd 命令来获取多个 oid,但这不是我想要的。
我基本上需要为每个 oid 打开一个线程并单独扫描它,这是一种非常低效的方法。
例如:

from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.smi import builder, view, error

def cbFun_OID(sendRequestHandle, errorIndication, errorStatus, errorIndex, varBinds, cbCtx):
(authData, transportTarget) = cbCtx
for oid, val in varBinds:
print val.prettyPrint()
ip='192.168.0.101'
cmdGen = cmdgen.AsynCommandGenerator()
cmdGen.asyncGetCmd(
cmdgen.CommunityData('public', mpModel=0),
cmdgen.UdpTransportTarget((ip, 161)),
((1,3,6,1,2,1,43,10,2,1,4,1,1),),
(cbFun_OID, (cmdgen.CommunityData('public', mpModel=0), cmdgen.UdpTransportTarget((ip, 161)))))
cmdGen.asyncGetCmd(
cmdgen.CommunityData('public', mpModel=0),
cmdgen.UdpTransportTarget((ip, 161)),
((1,3,6,1,2,1,43,5,1,1,1,1,123456),),
(cbFun_OID, (cmdgen.CommunityData('public', mpModel=0), cmdgen.UdpTransportTarget((ip, 161)))))
cmdGen.snmpEngine.transportDispatcher.runDispatcher()

即使某些 oid 不存在,如何使用 pysnmp 获取多个 oid?

最佳答案

您是否试图从包含不存在变量的 SNMP v1 响应中收集现有变量?在这种情况下,我不确定这是否符合 SNMP 标准。根据 RFC 2576:

4.1.2.3.1. If the error-status is anything other than noError,
...
- The variable binding list of the response PDU SHALL be made
exactly the same as the variable binding list that was received
in the original request.

由于 GET 请求通常包含 NULL 作为值,因此只要至少缺少一个变量,您就不会[可靠地]从 SNMP v1 代理接收任何值。

我在这里指的是 v1->v2c PDU 转换,因为您使用的 pysnmp API 在 PDU API 级别作为 v2c 实体工作,无论 SNMP 版本对等方正在通信如何。

如果您认为您的特定 v1 代理即使在报告错误状态的情况下仍然返回一些有意义的内容,您可以使用 packet-level API使用 SNMPv1 PDU,因为这不会调用 v1->v2c PDU 转换代码,从而破坏 v1 响应中的所有内容。在尝试之前,您可能希望 enable pysnmp debugging查看您收到的 v1 RESPONSE PDU 中实际包含的内容。

如果您认为 pysnmp 行为违反 SNMP 标准,请详细说明您的观点。

关于python - 如果使用 SNMPv1 找不到其中之一,Pysnmp 无法获取多个 oid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32305942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com