$ 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
。
所以,您会发现,即使唯一可观察到的变化也只是引号,幕后还发生了很多事情。