1

当我使用该函数encode将 OCTET 转换为 Hex 时,会添加一些不应该添加的字符。

例子:

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...

易SNMP:

    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...
4

2 回答 2

2

好的。我们可以告诉以下内容:

  • 两位经理的请求相同
  • 对两个请求的响应是相同的

这意味着 Net-SNMP 输出是“损坏”/转换的,或者 EasySNMP 输出是。

不幸的是,数据包捕获没有显示帖子原始版本中描述的交互,因此我们无法立即判断哪个管理器有问题。但是,可以根据我们看到的值进行扣除。

您的 Python 脚本的输出几乎是 snmpwalk 输出的超集:

  • 网络 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 编码。)

因此,使用一两个在线工具,让我们将第二个字节流解码为 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 一样)并且最后仍然有一堆噪音(如果您有兴趣,它们呈现如下:"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应该如何显示 an 。例如,这个 Net-SNMP 错误讨论了在适用时进行猜测。

无论如何,一切都很有趣,但我们能做些什么呢?

EasySNMP 文档相当薄,但我们可以在源代码中浏览一下(并且在此过程中,发现EasySNMP 实际上只是 Net-SNMP 的 Python 包装器!)以及在 EasySNMP 问题列表中,它转向以前有人抱怨过这个。

那么,我们又能做些什么呢?

嗯,我不确定我们做些什么。这是目前 EasySNMP 中的一个缺陷。事情是统一的(通过 EasySNMP 本身,通过转换为 Python 字符串,或通过前面描述的 Net-SNMP 兼容模块),即使它们不应该是。

但是,此章节提出了一种解决方法,您可以尝试:

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

新的最终论点应该关闭价值转换。但是,我不相信,因为根据文档,它已经False是默认设置了。

除了尝试之外,我认为您最好的选择是将您的权重添加到相关的问题报告中,并迫使开发人员提出解决方案。对不起。

于 2019-03-25T12:05:43.153 回答
0

为了获得正确的十六进制值,我正在使用它。

     def toRaw(s):
       x = [ord(i) for i in list(s)]
       return bytearray(x)
     
     print(toRaw(item.value).hex().upper())
于 2021-11-23T14:30:38.530 回答