Golang實現獲取SNMP V3數據


背景:批量初始化機器的時候經常有個別機器SNMP連接不通導致機器調度不生效,把功能封裝成借口,上線前可以批量檢測。

snmp的文檔比較少,抄襲還嚴重,做個筆記記錄一下使用方法。

代碼Demo:

package main

import (
	"fmt"
	g "github.com/gosnmp/gosnmp"
	"log"
	"net/http"
	"time"
)

func snmpget(ip string)[]byte{
	snmp := &g.GoSNMP{
		Target:        ip,
		Port:          161,
		Community:     "public",
		Version:       g.Version3,
		Timeout:       time.Duration(30) * time.Second,
		SecurityModel: g.UserSecurityModel,
		MsgFlags:      g.AuthNoPriv,  //Authentication and no privacy
		SecurityParameters: &g.UsmSecurityParameters {
			UserName: "myUserName", //輸入你設置的snmp用戶名
			AuthenticationProtocol: g.MD5,	//經過身份驗證的SnmpV3連接正在使用的身份驗證協議。
			AuthenticationPassphrase: "mypass", 	//輸入你公司的密碼
		},
	}
	err := snmp.Connect()
	if err != nil {
		log.Fatalf("Connect() err: %v", err)
	}
	defer snmp.Conn.Close()

	oids := []string{"1.3.6.1.2.1.1.5.0"}
	result, err := snmp.Get(oids)
	if err != nil {
		log.Fatalf("Get() err: %v", err)
	}
	fmt.Println(string(result.Variables[0].Value.([]byte)))
	return result.Variables[0].Value.([]byte)
	//for i, v := range result.Variables {
	//	fmt.Printf("%d. oid: %s ", i, v.Name)
	//	switch v.Type{
	//	case g.OctetString:
	//		fmt.Printf("string: %s\n", string(v.Value.([]byte)))
	//	default:
	//		fmt.Printf("number: %d\n", g.ToBigInt(v.Value))
	//	}
	//}

}

func handle(w http.ResponseWriter,r *http.Request)  {
	var ip string
	r.ParseForm()
	for k,v := range r.Form{
		if k == "ip" {
			ip = v[0]
		}
	}
	if ip != ""{
		hostname := snmpget(ip)
		w.Write(hostname)
	}else {
		w.Write([]byte("please input ip"))
	}

}


func main() {
	http.HandleFunc("/snmp",handle)
	http.ListenAndServe("0.0.0.0:8005",nil)
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM