EasySNMP: различные выходные данные, конвертирующие OCTETSTR в Hex

  1. Некоторая документация делает большее улучшение, чем рефакторинг.
  2. Ваш макрос -> путает вывод типа sbcl. Вы должны (-> x) развернуть x и (-> x y...) на (let (($ x)) (-> y...))
  3. . Вы должны научиться использовать loop и использовать его в большем количестве мест. dolist с дополнительной мутацией невелик
  4. Во многих местах вы должны использовать destructuring-bind вместо, например, (rest (rest )). Вы также несовместимы, поскольку иногда вы пишете (cddr...) для этого.
  5. Ваш block* страдает множеством проблем: он использует (let (foo) (setf foo...)), который вытаскивает вывод типа sbcl. Имя block* подразумевает, что различные привязки привязаны таким образом, что они могут ссылаться на те ранее определенные вещи, но на самом деле все начальное значение может относиться к любому имени переменной или функции, и если эта переменная не была инициализирована, то она оценивает значение nil ,
  6. Стиль определения множества функций внутри другой функции, когда они могут быть снаружи, более типичен для схемы (которая имеет синтаксис для нее), чем Common Lisp.
  7. get-x-y-and-z-ranges действительно нужен использовать loop. Я думаю, что это тоже неправильно: списки имеют разные длины.
  8. Вам нужно определить некоторые функции доступа, а не использовать first и т. Д. Возможно, даже структура (!) [/ ​​G9]
  9. (sort foo) может уничтожить foo. Вам нужно сделать (setf foo (sort foo)).
  10. В принципе нет причин использовать do. Используйте loop.
  11. Вы должны, вероятно, использовать :key в нескольких местах.
  12. Вы пишете defvar, но я думаю, что вы имеете в виду defparameter
  13. *t* - глупое имя
  14. Большинство имен плохие и, похоже, не говорят мне, что происходит.
  15. Я могу быть идиотом, но не могу сказать что делает ваша программа. Вероятно, это может быть связано с большой работой
1
задан TMoraes 22 March 2019 в 17:05
поделиться

1 ответ

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

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

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

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

Ваш вывод сценария Python является почти надмножеством вывода snmpwalk:

  • сетевой SNMP:

    • сценарий 00 AE
  • Python C5 C0 AC 84 C6 5F 95 EF B0 4E 26 8B 1C 4 А:

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

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

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

Так, с помощью сетевой инструмент или два , давайте декодировать тот второй поток байтов как 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+59 U+93 U+B0 U+4E U+26 U+8B U+4E U+AD

U+AE

Эй, который выглядит знакомым! (Снова, я имею полужирный биты, которые соответствуют выводу сетевого SNMP.) U+00 отсутствует (по-видимому, потому что , который является "пустым" байтом как в ASCII) и существует все еще набор шума в конце (если Вам интересно, они представляют как это: " Y “ ° N & ‹ N ­"; ), но мы можем теперь, по крайней мере, видеть то, что продолжается: Ваш исходный поток байтов был повторно закодирован как строка 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 должен быть отображен. Например, эта ошибка сетевого SNMP обсуждает буквально создание предположение , когда применимо.

Так или иначе, все очень интересные, но что мы можем делать с этим?

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

Снова, тогда, что мы можем делать с этим?

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

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

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

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

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

0
ответ дан Lightness Races in Orbit 22 March 2019 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: