pysnmp walk v2c, если нет ответа, попробуйте v3
Я пытаюсь написать сценарий snmp с python и pysnmp, но я не могу найти простой способ попробовать snmp v2c walk, и если нет ответа, попробуйте v3 без необходимости писать в основном тот же код снова. Есть ли простой способ сделать это? Я не мог найти способ.
Это то, что у меня сейчас есть, но я чувствую, что это очень неэффективно.
from pysnmp.hlapi import *
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget(('demo.snmplabs.com', 161)),
ContextData(),
ObjectType(ObjectIdentity('sysDescr')))
)
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
elif
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
UsmUserData('usr-md5-none', 'authkey1'),
UdpTransportTarget(('demo.snmplabs.com', 161)),
ContextData(),
ObjectType(ObjectIdentity('IF-MIB', 'ifInOctets', 1)))
)
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
1 ответ
Вдобавок ко всему, вы можете просто использовать тот факт, что объекты аутентификации SNMP v1 и v3 могут использоваться взаимозаменяемо:
from pysnmp.hlapi import *
snmpEngine = SnmpEngine()
for snmpAuth in CommunityData('public'), UsmUserData('usr-md5-none', 'authkey1'):
snmpQueryIterator = getCmd(
snmpEngine,
snmpAuth,
UdpTransportTarget(('demo.snmplabs.com', 161)),
ContextData(),
ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0))
)
errorIndication, errorStatus, errorIndex, varBinds = next(snmpQueryIterator)
if errorIndication:
continue
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
break
Приведенный выше код выполняет SNMP GET-запрос. Если вам нужно "пройтись" по агенту, возможно, вам придется немного адаптировать его к операции GETNEXT. Вот пример.