为什么定义 MIBS 环境变量时 snmpget 输出不同?

为什么定义 MIBS 环境变量时 snmpget 输出不同?
$ export MIBS=
$ snmpget -Oqv -v 2c -c public 10.xxx.yyy.zzz .1.3.6.1.4.1.3375.2.1.14.3.2.0
"ACTIVE"

$ export MIBS=F5-BIGIP-SYSTEM-MIB
$ snmpget -Oqv -v 2c -c public 10.xxx.yyy.zzz .1.3.6.1.4.1.3375.2.1.14.3.2.0
ACTIVE

当 MIBS 环境变量有值时,为什么输出会有差异?

答案1

SNMP mib 定义了您的 SNMP OID 的数据类型,因此加载 MIB 后它可以显示值的“格式化”版本而不是显示原始值。

例如,比较一下:

MIBS= snmpget -v2c -c public 192.168.1.1 1.3.6.1.2.1.2.2.1.3.1
iso.3.6.1.2.1.2.2.1.3.1 = INTEGER: 24

和:

$ snmpget -v2c -c public 192.168.1.1 1.3.6.1.2.1.2.2.1.3.1
IF-MIB::ifType.1 = INTEGER: softwareLoopback(24)

当 mib 被加载时,snmpget知道如何解释该值。


在您的问题的特定情况下,mibs 说“将该值显示为字符串”。

答案2

更具体。

如果没有 MIB 文档,SNMP 工具就只能识别协议本身定义的最基本的数据类型,

  • 整数
  • 八位字节串
  • 无效的
  • 对象标识符
  • IP地址
  • Counter32
  • 量规32
  • 时间刻数
  • 不透明
  • 网络地址
  • Counter64

由于数据采用 ASN.1 BER 编码,解码算法可以从网络上的原始字节中提取此类数据类型。

因此,当您在没有 MIB 文档的情况下运行 NET-SNMPsnmpget命令时,它仅将数据解码为 OCTET STRING 并打印为"ACTIVE"

但是,SMI v1 或 v2 中的 MIB 文档允许通过所谓的“文本约定”在这些基本类型上定义自定义数据类型。在您的例子中,MIB 文档F5-BIGIP-SYSTEM-MIB将对象定义.1.3.6.1.4.1.3375.2.1.14.3.2如下,

sysCmFailoverStatusStatus OBJECT-TYPE 
    SYNTAX LongDisplayString
    MAX-ACCESS read-only
    STATUS current
    DESCRIPTION
        "The failover status on the system."
    ::= { sysCmFailoverStatus 2 }

实际数据类型LongDisplayString定义在F5-BIGIP-COMMON-MIB

LongDisplayString ::= TEXTUAL-CONVENTION
    DISPLAY-HINT "1024a"
    STATUS       current
    DESCRIPTION  "A longer version of SNMPv2-TC::DisplayString."
    SYNTAX       OCTET STRING (SIZE (0..1024))

因此,当您要求 NET-SNMPsnmpget命令加载 MIB 文档时,它完全了解的数据类型LongDisplayString并打印ACTIVE

所以,您会发现,即使唯一可观察到的变化也只是引号,幕后还发生了很多事情。

相关内容