【问题标题】:EasySNMP: Different output converting OCTETSTR to HexEasySNMP:将 OCTETSTR 转换为十六进制的不同输出
【发布时间】:2019-01-18 17:46:22
【问题描述】:

当我使用函数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...

【问题讨论】:

  • 你能证明这两种情况下该请求和响应的数据包捕获(例如 Wireshark)吗?
  • 您能指出或向我们展示此对象的 MIB 定义吗?
  • @LightnessRacesinOrbit 你想知道在这两种情况下使用wireshark的响应是否返回相同的值吗?
  • 关于 MIB 定义,我在哪里可以找到它? Mib 文件???
  • 是的,这就是我们想知道的——但除了知道它们是否相同之外,了解它们是什么有助于我们了解情况。至于MIB,我不知道,只有你知道。放在哪里都行!或者你因为某种原因没有使用一个?为什么不呢?

标签: python hex snmp octetstring


【解决方案1】:

好的。我们可以告诉你:

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

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

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

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

  • 网络 SNMP:

    • AC 84 C6 5F 95 EF B0 4E 26 8B 1C C5 C0 4A 00 AE​​strong>
  • 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”(实际上没有这样的东西,但在许多代码页中)。啊哈,红旗。为什么是红旗?因为this is commonly evidence of misinterpreted UTF-8。 (我可以更详细地解释为什么,但如果你愿意,我会让你单独研究 Unicode 编码。)

所以,使用an online tooltwo,让我们将第二个字节流解码为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 丢失(可能是因为that is a "null" byte much as in ASCII),最后仍然有一堆噪音(如果你有兴趣,它们会呈现为this: "Y°N&N"),但我们现在至少可以看到发生了什么:您的原始字节流已被重新编码为 UTF-8 字符串。确实,Python 3's default encoding is UTF-8

像 C6 这样的字节完全消失的原因是它们超出了 ASCII 范围,因此在 Unicode 中“不干净”地映射。 ASCII C6,原来是is U+00C6, which is represented in UTF-8 by C3 86,所以现在我们也知道了非粗体字节的来源。

因此,EasySNMP 将您的遍历结果视为字符串,而不是不透明的字节序列,因此 Python 已经破坏了它。然后,当您编写 .encode("hex") 时,您会得到这个新的、伪造的 UTF-8 字符串的十六进制对表示。

这可能不会发生。 SNMP 响应明确表示为“OctetString”,规范告诉我们"The OCTET STRING type represents arbitrary binary or textual data"。与您通信的代理的 MIB(您似乎没有使用或至少没有提供)可能会提供进一步的编码信息;在没有该信息的情况下,无法确定应该如何显示OCTET STRING。例如,this Net-SNMP bug 讨论了在适用时进行猜测

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

EasySNMP 文档相当薄,但我们可以在源代码中翻找一下(在此过程中,发现 EasySNMP is actually just a Python wrapper around Net-SNMP!)和 EasySNMP 问题列表,原来是 someone's complained about this before

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

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

不过,this chap has suggested a workaround 你可以试试:

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

新的最终论点应该关闭价值转换。但是,我并不相信,因为 per the docs 默认已经是 False

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

【讨论】:

  • 感谢回答的朋友。我明白了,你有什么建议?我的意思是,我可以使用哪种解决方案?今天我在 python 中运行一个 bash 脚本(snmpwalk),它写入一个文件,python 操作它。但我认为这太慢了
  • “我认为你最好的选择是在相关问题报告中增加你的权重,并迫使开发人员提出解决方案。抱歉。” 你'重新做我可能会做的解决方法。显然,被“修复”的图书馆会好得多。
  • 我在考虑另一个库,但我会这样做,显然这对社区来说是最好的。再次感谢您的回复
  • @TMoraes 好吧-我不知道周围还有什么其他图书馆。如果您找到好的解决方案,请告诉我们!
【解决方案2】:

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

     def toRaw(s):
       x = [ord(i) for i in list(s)]
       return bytearray(x)
     
     print(toRaw(item.value).hex().upper())

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 2015-08-10
    • 2017-11-05
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多