为什么有不同的 STRING 格式?

Why are there different STRING formats?

前段时间我开发了一个脚本来通过 snmpwalkIF-MIB::ifDescr 查询网络接口,输出格式类似于 STRING: eth0。 OS 是使用 net-snmp 的 SLES11(它仍然可以在使用 net-snmp-5.7.3 的 SLES12 中工作)。

然而,在不同的 OS(仍然是 Linux)上,接口字符串表示为 STRING: "port1"(注意周围的双引号)。 现在的问题是:谁负责额外的双引号?不同版本的 net-snmp,或不同的 SNMP 代理?还是其中一个结果在代理中执行不正确?

据我了解 SNMP,双引号不是协议所必需的,因为字符串总是随长度一起传输。

虽然 SNMP 代理提供 quoted 字符串来响应 ifDescr(或其他任何内容! ) 因为它们确实不是那个级别的字符串契约的一部分,所以 SNMP 世界充满了奇怪、变化和规范偏差,所以这不是你可以假设永远不会发生的事情。

同时,像 Net-SNMP 这样的工具的命令行输出格式实际上是任意的:开发人员可以选择是否引用字符串,只要他们记录他们的选择,最终结果是相同。所以你也不能在这里做任何假设。

您应该检查实际数据。您可以通过使用像 tcpdump 这样的工具嗅探 SNMP 数据包并将它们加载到像 Wireshark(以前的 Ethereal)这样的 UI 中来做到这一点。然后,您可以观察到没有 Net-SNMP 格式的数据报的 actual 内容。如果它包含引号,那是代理的错;如果没有,应用程序正在添加它们以供显示。

(可能有一个 Net-SNMP 标志使其以十六进制形式显示组成字符串的字节,如果我记得标志是什么,这将是收集此证据的更简单方法是。)

作为编辑说明,如果您告诉我们 "different" Linux OS actually 是什么,以及什么版本您在其上使用的 Net-SNMP,我们可以为您确认(或排除)选项二。

(就其价值而言,我不知道在命令行输出中添加或删除引号的任何 Net-SNMP 更改,所以这 可能 "different" 系统上的代理很奇怪。)