![為什麼定義 MIBS 環境變數時 snmpget 輸出不同?](https://rvso.com/image/782622/%E7%82%BA%E4%BB%80%E9%BA%BC%E5%AE%9A%E7%BE%A9%20MIBS%20%E7%92%B0%E5%A2%83%E8%AE%8A%E6%95%B8%E6%99%82%20snmpget%20%E8%BC%B8%E5%87%BA%E4%B8%8D%E5%90%8C%EF%BC%9F.png)
$ 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位址
- 櫃檯32
- 規格32
- 時間滴答聲
- 不透明
- 網路位址
- 櫃檯64
由於資料以 ASN.1 BER 進行編碼,因此解碼演算法可以透過線路從原始位元組中提取此類資料類型。
因此,當您在沒有 MIB 文件的情況下執行 NET-SNMP 的snmpget
命令時,它僅將資料解碼為 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
。
所以,你會看到,唯一可觀察到的變化只是引號,幕後發生了很多事情。