go使用snmp庫查詢mib資料

2023-10-19 06:01:05

轉載請註明出處:

  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 代理伺服器。