轉載請註明出處:
OID(Object Identifier)是一種用於標識和唯一命名管理資訊庫中的物件的標準方式。給定一個OID,可以確定特定的管理資訊庫物件,並對其進行操作。
go語言使用snmp庫中的 k-sone/snmpgo 實現相關mib查詢的程式碼如下:
package main import ( "fmt" "log" "net" "github.com/k-sone/snmpgo" ) func main() { // 建立SNMP對談 session := snmpgo.NewSNMP(goSNMP.Version2c, 5000000, snmpgo.Default) err := session.Open() if err != nil { log.Fatalf("無法開啟SNMP對談:%v", err) } defer session.Close() // 設定SNMP目標 target := &snmpgo.SNMPTarget{ Address: "localhost", Port: 161, Community: "public", Version: snmpgo.Version2c, } // 建立SNMP GET請求 pdu := snmpgo.NewPdu(snmpgo.GetRequest) pdu.AddOid(snmpgo.MustParseOid("1.3.6.1.2.1.55.1.7.1.5")) // 傳送SNMP請求 packet, err := pdu.Marshal() if err != nil { log.Fatalf("SNMP請求封包失敗:%v", err) } result, err := session.GetBulk(packet, target) if err != nil { log.Fatalf("SNMP GET請求失敗:%v", err) } // 處理SNMP響應 if result.ErrorStatus() != snmpgo.NoError { log.Fatalf("SNMP響應錯誤:%s", result.ErrorStatus()) } // 解析SNMP響應 respPdu := result.PduAtIndex(0) if respPdu == nil { log.Fatal("未收到SNMP響應") } // 獲取系統啟動時間的值 startupTime := respPdu.VariableBindings()[0].Variable.String() fmt.Printf("系統啟動時間:%s\n", startupTime) }
上述程式碼中,使用了snmpgo
庫來進行SNMP通訊。首先,建立了一個SNMP對談,並設定SNMP目標的地址、埠和共同體(community)。然後,我們建立了一個GET請求,並將要獲取的OID新增到請求中。接下來,傳送SNMP請求,並處理響應。如果請求成功,我們從響應中解析出系統啟動時間的值並列印出來。
請注意,在執行此範例之前,確保已經安裝了 snmpgo
庫(可以通過 go get github.com/k-sone/snmpgo
進行安裝)以及有可用的 SNMP 代理伺服器。