EasySNMP: различные выходные данные, конвертирующие OCTETSTR в Hex - PullRequest
0 голосов
/ 18 января 2019

Когда я использую функцию encode для преобразования OCTET в шестнадцатеричный код, некоторые символы добавляются, когда этого не следует.

Пример:

Linux: snmpwalk -t 5 -v2c -c public 192.168.10.150 iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1

Выход SNMPWALK: iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.144 = Hex-STRING: AC 84 C6 5F 95 EF B0 4E 26 8B 1C C5 C0 4A 00 AE

Код:

session = Session(hostname='192.168.10.150', community='public', version=2)
description = session.walk('iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1')

for item in description:
    print '{oid}.{oid_index} {snmp_type} = {value}'.format(
         oid=item.oid,
         oid_index=item.oid_index,
         snmp_type=item.snmp_type,
         value=item.value.encode("hex"))

Выход EasySNMP: iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.144. OCTETSTR = c2acc284c3865fc295c3afc2b04e26c28b1cc385c3804a00c2ae59c293c2b04e26c28b4ec2ad

Используются некоторые OID, но результат отличается от того, что я ожидал. Это правильный способ использования easysnmp?

захват пакета

SNMPWalk (Linux):

    192.168.10.214  192.168.10.150  get-next-request 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1 Value(NULL)
Simple Network Management Protocol
    version: v2c (1)
    community: public
    data: get-next-request (1)
        get-next-request
            request-id: 686772965
            error-status: noError (0)
            error-index: 0
            variable-bindings: 1 item
                1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1: Value (Null)
                    Object Name: 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1 (iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1)
                    Value (Null)

    192.168.10.150  192.168.10.214  get-response 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.51 
Value(00:02:18:a6:f7:65:88:f5:18:a6:f7:65:18:a6:f7:65:88:f5:b0:4e:26:8a:e3:cb:50:c7:bf:f2:db:95:b0:4e:26:ed:8d:c5:98:de:d0:76:e3:01:00:02:98:de:d0:76)
Simple Network Management Protocol
    version: v2c (1)
    community: public
    data: get-response (2)
        get-response
            request-id: 686772965
            error-status: noError (0)
            error-index: 0
            variable-bindings: 1 item
                1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5: 000218a6f76588f518a6f76518a6f76588f5b04e268ae3cb...
                    Object Name: 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5 (iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5)
                    Value (OctetString): 000218a6f76588f518a6f76518a6f76588f5b04e268ae3cb...


    192.168.10.214  192.168.10.150  get-next-request 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5 Value(NULL)
Simple Network Management Protocol
    version: v2c (1)
    community: public
    data: get-next-request (1)
        get-next-request
            request-id: 686772966
            error-status: noError (0)
            error-index: 0
            variable-bindings: 1 item
                1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5: Value (Null)
                    Object Name: 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5 (iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5)
                    Value (Null)


    192.168.10.150  192.168.10.214  get-response 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.2.48 Value(70:4f:57:4d:cc:cf:b0:4e:26:8b:45:11:ac:84:c6:1d:0e:c5:70:4f:57:3a:dd:5b:70:4f:57:4c:92:8f:b0:4e:26:8a:ef:99)
Simple Network Management Protocol
    version: v2c (1)
    community: public
    data: get-response (2)
        get-response
            request-id: 686772966
            error-status: noError (0)
            error-index: 0
            variable-bindings: 1 item
                1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.2.48: 704f574dcccfb04e268b4511ac84c61d0ec5704f573add5b...
                    Object Name: 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.2.48 (iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.2.48)
                    Value (OctetString): 704f574dcccfb04e268b4511ac84c61d0ec5704f573add5b...

EasySNMP:

    192.168.10.214  192.168.10.150  get-next-request 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1 Value(NULL)
Simple Network Management Protocol
    version: v2c (1)
    community: public
    data: get-next-request (1)
        get-next-request
            request-id: 1767019562
            error-status: noError (0)
            error-index: 0
            variable-bindings: 1 item
                1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1: Value (Null)
                    Object Name: 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1 (iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1)
                    Value (Null)


    192.168.10.150  192.168.10.214  get-response 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5 Value(00:02:18:a6:f7:65:88:f5:18:a6:f7:65:18:a6:f7:65:88:f5:b0:4e:26:8a:e3:cb:50:c7:bf:f2:db:95:b0:4e:26:ed:8d:c5:98:de:d0:76:e3:01:00:02:98:de:d0:76)
Simple Network Management Protocol
    version: v2c (1)
    community: public
    data: get-response (2)
        get-response
            request-id: 1767019562
            error-status: noError (0)
            error-index: 0
            variable-bindings: 1 item
                1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5: 000218a6f76588f518a6f76518a6f76588f5b04e268ae3cb...
                    Object Name: 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5 (iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5)
                    Value (OctetString): 000218a6f76588f518a6f76518a6f76588f5b04e268ae3cb...



    192.168.10.214  192.168.10.150  get-next-request 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5 Value(NULL)
Simple Network Management Protocol
    version: v2c (1)
    community: public
    data: get-next-request (1)
        get-next-request
            request-id: 1767019563
            error-status: noError (0)
            error-index: 0
            variable-bindings: 1 item
                1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5: Value (Null)
                    Object Name: 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5 (iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.1.5)
                    Value (Null)


    192.168.10.150  192.168.10.214  get-response 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.2.48 VALUE(70:4f:57:4d:cc:cf:b0:4e:26:8b:45:11:ac:84:c6:1d:0e:c5:70:4f:57:3a:dd:5b:70:4f:57:4c:92:8f:b0:4e:26:8a:ef:99)
Simple Network Management Protocol
    version: v2c (1)
    community: public
    data: get-response (2)
        get-response
            request-id: 1767019563
            error-status: noError (0)
            error-index: 0
            variable-bindings: 1 item
                1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.2.48: 704f574dcccfb04e268b4511ac84c61d0ec5704f573add5b...
                    Object Name: 1.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.2.48 (iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.1.1.2.48)
                    Value (OctetString): 704f574dcccfb04e268b4511ac84c61d0ec5704f573add5b...

1 Ответ

0 голосов
/ 25 марта 2019

Хорошо. Мы можем сказать следующее:

  • Запросы у обоих менеджеров идентичны
  • Ответы на оба запроса идентичны

Это означает, что либо выход Net-SNMP "искажен" / преобразован, либо выход EasySNMP равен.

К сожалению, захваты пакетов не показывают взаимодействия, которые были описаны в оригинальной версии поста, поэтому мы не можем сразу сказать, какой менеджер виноват. Тем не менее, можно сделать вычет на основе значений, которые мы видим.

Вывод вашего Python-скрипта является почти расширенным набором выводов snmpwalk:

  • Net-SNMP:

    • AC 84 C6 5F 95 EF B0 4E 26 8B 1C C5 C0 4A 00 AE
  • Скрипт Python:

    • C2 AC C2 84 C3 86 5F C2 95 C3 AF C2 B0 4E 26 C2 8B 1C C3 85 C3 80 4A 00 C2 AE 59 C2 93 C2 B0 4E 26 C2 8B 4E C2 AD

Так почему же были добавлены дополнительные байты, и почему некоторые байты были потеряны? Это пахнет как перекодировка исходных данных, верно?

Мы можем заметить, что байт C2 много всплывает. Что это такое? Это «расширенный ASCII» (на самом деле такого нет, но во многих кодовых страницах) для персонажа. Ага, красный флаг. Почему это красный флаг? Потому что это обычно свидетельствует о неверной интерпретации UTF-8 . (Я мог бы объяснить более подробно , почему это так, но я позволю вам исследовать кодировки Unicode отдельно, если хотите.)

Итак, используя онлайн-инструмент или two , давайте декодируем этот второй поток байтов как UTF-8 и посмотрим, какие логические кодовые точки мы получаем:

U + AC U + 84 U + C6 U + 5F U + 95 U + EF U + B0 U + 4E U + 26 U + 8B U + 1C U + C5 U + C0 U + 4A U + AE U + 59 U + 93 U + B0 U + 4E U + 26 U + 8B U + 4E U + AD

Эй, это выглядит знакомо! (Опять же, я выделил биты, соответствующие выходу Net-SNMP.) U + 00 отсутствует (предположительно, потому что , что является "нулевым" байтом, как в ASCII ), и все еще есть куча шум в конце (если вам интересно, они отображаются так: "& # x59; & # x93; & # xB0; & # x4E; & # x26; & # x8B; & # x4E; & # xAD; "), но теперь мы можем хотя бы посмотреть, что происходит: ваш исходный поток байтов был перекодирован в виде строки UTF-8. Действительно, Кодировка Python 3 по умолчанию - UTF-8 .

Причина, по которой байты типа C6 полностью исчезли, заключается в том, что они выходят за пределы диапазона ASCII, поэтому отображение «нечисто» в Unicode. Оказывается, ASCII C6, - это U + 00C6, который представлен в UTF-8 C3 86 , так что теперь мы знаем, откуда берутся несжатые байты.

Итак, EasySNMP обрабатывает ваш результат обхода как строку , а не как непрозрачную последовательность байтов, и в результате Python искажает его. Затем, когда вы написали .encode("hex"), вы получили представление шестнадцатеричной пары этой новой фальсифицированной строки UTF-8.

Это, вероятно, не должно происходить. Ответ SNMP четко обозначен как «OctetString», и спецификация говорит нам, что «Тип OCTET STRING представляет произвольные двоичные или текстовые данные» . MIB (который вы, по-видимому, не используете или, по крайней мере, не предоставил) для агента, с которым вы общаетесь, может предоставить дополнительную информацию о кодировании; в отсутствие этой информации невозможно точно узнать, как должен отображаться OCTET STRING. Например, эта ошибка Net-SNMP обсуждает буквально создание догадки , когда это применимо.

В любом случае, все очень интересно, но что мы можем с этим поделать?

Документы EasySNMP довольно тонкие, но мы можем немного покопаться в исходном коде (и в процессе обнаружим, что EasySNMP на самом деле является просто оболочкой Python для Net-SNMP! ) и включен список проблем EasySNMP, где выясняется, что кто-то жаловался на это до .

Опять же, что мы можем с этим поделать?

Хм, я не уверен, что мы многое можем сделать с этим. В настоящее время это недостаток EasySNMP. Вещи Unicodised (либо самим EasySNMP, путем преобразования в строки Python, либо описанным выше модулем Compat Net-SNMP), даже если они не должны быть.

Однако, этот глава предложил обходной путь , который вы можете попробовать:

session = Session(
   hostname='192.168.10.150',
   community='public',
   version=2,
   use_sprint_value=False
)

Этот новый последний аргумент должен отключить преобразование значения. Однако я не уверен, потому что по документам это уже False по умолчанию.

Помимо попыток сделать это в любом случае, я думаю, что вам лучше всего добавить свой вес в соответствующий отчет (ы) о проблеме и оказать давление на разработчика, чтобы он предложил исправление. К сожалению.

...