当我使用函数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...
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...
好的。我们可以告诉以下内容:
这意味着Net-SNMP输出被“修改”/转换,或EasySNMP输出。
遗憾的是,数据包捕获不会显示帖子原始版本中描述的交互,因此我们无法立即判断哪个经理有错。但是,可以根据我们看到的值进行推算。
您的Python脚本的输出几乎是snmpwalk输出的超集:
那么为什么要添加额外的字节,为什么有些字节丢失了?这有点像源数据的重新编码,对吧?
我们可以观察到字节C2弹出了很多。那是什么?这是角色的“扩展ASCII”(实际上没有这样的东西,但在许多代码页中)。啊哈,红旗。为什么是红旗?因为this is commonly evidence of misinterpreted UTF-8。 (我可以更详细地解释为什么会这样,但如果你愿意,我会让你分别研究Unicode编码。)
因此,使用an online tool或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缺失(大概是因为that is a "null" byte much as in ASCII)并且最后还有一堆噪音(如果你感兴趣的话,它们会像这样渲染: “Y”°N&<N“),但我们现在至少可以看到发生了什么:您的原始字节流已被重新编码为UTF-8字符串。的确,Python 3's default encoding is UTF-8。
像C6这样的字节完全消失的原因是它们超出了ASCII范围,所以在Unicode中映射“uncleanly”。事实证明,ASCII C6,is U+00C6, which is represented in UTF-8 by C3 86,所以现在我们知道unbolded字节的来源。
因此,EasySNMP将您的walk结果视为一个字符串而不是一个不透明的字节序列,因此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的一个缺陷。事情是Unicodised(通过EasySNMP本身,通过转换为Python字符串,或通过前面描述的Net-SNMP compat模块),即使它们不应该。
但是,你可以尝试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
了。
除了尝试之外,我认为最好的办法是将你的权重加到相关的问题报告中,并迫使开发人员提出修复方案。抱歉。