我正在尝试通过SNMP从ucs-6100中获取答案。

通过控制台:(类似我的请求)

>>> snmpget -v3 -l authPriv -u usr-sha-aes -A authkey1 -X privkey1 -a SHA -x AES demo.snmplabs.com SNMPv2-MIB::sysDescr.0


我成功

但是当我使用pysnmp(像这样)

from pysnmp.hlapi import *
resp = next(getCmd(SnmpEngine(),
       UsmUserData('usr-sha-aes', 'authkey1', 'privkey1',
                   authProtocol=usmHMACSHAAuthProtocol,
                   privProtocol=usmAesCfb128Protocol),
       UdpTransportTarget(('demo.snmplabs.com', 161)),
       ContextData(),
       ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
)


(使用这些参数进行编码即可)

我总是得到答案:

Out[20]:(pysnmp.proto.errind.UnknownEngineID('Unknown SNMP engine ID encountered'),
0,
0,
[])


我认为这是因为协议的配置。
是否可以不随请求一起发送引擎?
或任何其他设计。

提前致谢。
python 3.6
pysnmp 4.4.9

最佳答案

因此,我找到了崩溃的地方。

如果与平衡器打交道,可能会遇到类似的问题。
描述:
当我们从控制台“ snmpget”通过/ balancer_host /发送请求时,我们没有什么不同,并且我们清楚地从/ host_1 /或/ host_2 /收到了响应(对host_1 / 2的直接请求也总是成功的,但是在实际情况下我们不会已知的主机是“ balanser”还是否,我们不知道响应的主机是哪一个。)

当我们通过/ balancer /从脚本“ pysnmp”发送请求时,我们收到错误消息“ UnknownEngineID”,是的,我们可以尝试使用“ snmp_engine.observer”获取正确的EngineID:

observer_context = {}
snmp_engine.observer.registerObserver(
    lambda e, p, v, c: c.update(securityEngineId=v['securityEngineId']),
    'rfc3412.prepareDataElements:internal',
    cbCtx=observer_context)
auth_data = UsmUserData('non-existing-user')
next(getCmd(snmp_engine, auth_data,
transport_target, ContextData(), ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0))))
print(observer_context['securityEngineId'].prettyPrint())


并创建正确的引擎,但是我们仍然会遇到类似的问题,因为我们使用从/ host_1 /获取的SnmpEngine(EngineID)将请求发送到/ balancer_host /。
因此,来自观察者的测试请求正在运行,真正的数据请求-不。
但我有兴趣知道,请求如何在“ snmpget”中工作-始终成功。

有人有一些想法如何在没有SnmpEngine的情况下通过“平衡器”发送请求?

10-08 03:49