проблема с выходным форматом pysnmp

Я пытаюсь получить некоторые переменные snmp от маршрутизаторов cisco, используя PySNMP, но я получаю шестнадцатеричный вывод, используя prettyprint вместо вывода, который я получаю от моего обычного браузера snmp.

Я пробовал несколько кодировок (hex, utf-8 and ascii) и без кодирования всегда не то, что я ожидал.

Любые идеи? Спасибо

Начать обнаружение 10.148.8.15

1.3.6.1.2.1.1.1.0 = 0x436973636f20494f5320536f6674776172652c20494f532d584520536f66747761726520285838365f36345f4c494e55585f494f53442d554e4956455253414c4b392d4d292c2056657273696f6e2031352e3228342953352c2052454c4541534520534f4654574152452028666331290d0a546563686e6963616c20537570706f72743a20687474703a2f2f7777772e636973636f2e636f6d2f74656368737570706f72740d0a436f707972696768742028632920313938362d3230313420627920436973636f2053797374656d732c20496e632e0d0a436f6d70696c6564205475652032352d4665622d31342031313a3336206279206d63707265

   result = {'error': 1, 'value': "default"}
cmdGen = cmdgen.CommandGenerator()
errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
cmdgen.CommunityData(community),
cmdgen.UdpTransportTarget((destination, 161)),
cmdgen.MibVariable(oid)

)

# Check for errors and print out results
if errorIndication:
    print(errorIndication)
else:
    if errorStatus:
        result['error'] = 1
        # print('%s at %s' % (
        #     errorStatus.prettyPrint(),
        #     errorIndex and varBinds[int(errorIndex)-1] or '?'
        #     )
        # )
    else:
        result['error'] = 0
        for name, val in varBinds:
            print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
            result['value'] = val.prettyPrint().encode("ascii")

person user2396917    schedule 29.12.2014    source источник


Ответы (1)


Это связано с тем, что агент Cisco SNMP сообщает об управляющих символах (\n), которые потенциально могут испортить вывод вашего сценария. Есть несколько способов справиться с этим:

  1. Передайте lookupMib=True, как показано в в этом примере. Затем pysnmp попытается найти правильный выходной формат для этого конкретного OID в MIB. Чтобы это работало, pysnmp должен иметь возможность находить и загружать файлы MIB в формате pysnmp.

  2. Добавьте некоторый код для запуска декодера шестнадцатеричных строк, когда виден префикс 0x:

    s =     '436973636f...06d63707265'
    
    print(''.join([ chr(int(s[x:x+2], 16)) for x in range(0, len(s), 2) ]))
    

Программное обеспечение Cisco IOS, программное обеспечение IOS-XE ... Составлено mcpre, Вт, 25 февраля 2014 г., 11:36.

person Ilya Etingof    schedule 29.12.2014