PYSNMP v3 против CISCO

Я пытаюсь получить ответ от ucs-6100 по SNMP.

Через консоль: (аналог моего запроса)

>>> 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,
[])

Я думаю, что это из-за конфигурации протокола. Можно ли не присылать движок с запросом? Или любой другой дизайн.

Заранее спасибо. питон 3.6 пснмп 4.4.9


person Alex    schedule 22.02.2019    source источник
comment
Различные агенты SNMP имеют разные настройки, и некоторые из них требуют указания идентификатора ядра. Вы должны обратиться к документации/руководствам агента для получения дополнительной информации, на которую SO не может ответить.   -  person Lex Li    schedule 23.02.2019
comment
Я не уверен, что правильно понял - точный код Python, который вы вставили, не работает против demo.snmplabs.com? Или он терпит неудачу только против cisco?   -  person Ilya Etingof    schedule 23.02.2019
comment
Прошу прощения за неполное описание. Для более четкого описания:‹br/› snmpget (консоль) | demo.snmplabs.com (пример) - ok‹br/› pysnmp (сценарий) | demo.snmplabs.com(пример) - ok‹br/› snmpget (консоль) | устройство cisco - ok‹br› pysnmp (сценарий) | cisco device - fail‹br› ‹br/› не могу подключиться в скрипте только при звонке на cisco device   -  person Alex    schedule 25.02.2019


Ответы (1)


Итак, я нашел, где он разбился.

Если вы имеете дело с балансировщиками, у вас может быть аналогичная проблема.
Описание:
Когда мы отправляем запрос через /balancer_host/ из консоли с помощью «snmpget», у нас нет разницы, и мы получаем ответ от /host_1/ или / host_2/ явно (прямой запрос к host_1/2 тоже всегда успешен, но в реальной ситуации мы не знаем, является ли хост "балансером" или нет, и мы не знаем, какой из хостов ответил.)

Когда мы отправляем запрос через /balancer/ из скрипта с «pysnmp», мы получаем ошибку «UnknownEngineID», да, мы можем попытаться получить правильный EngineID с помощью «snmp_engine.observer»:

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())

и создать правильный движок, но тем не менее мы получим аналогичную проблему, потому что мы отправляем запрос на /balancer_host/ с SnmpEngine(EngineID), который был получен от /host_1/(например).
Итак, тестовый запрос от наблюдателя работает, настоящий запрос данных - нет.
Но мне интересно узнать, как работает запрос в "snmpget" - всегда успешно.

У кого-нибудь есть идеи, как отправить запрос через "балансировщик" без использования SnmpEngine?

person Alex    schedule 26.02.2019