• 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)
    }
    
    
  • 相关阅读:
    寒假day08
    操作系统(一)操作系统的目标和作用
    数据结构排序算法稳定性总结——写给自己看
    网络请求生命周期
    PHP 不同类型之间的松散和严格比较
    php配置可被设定范围
    laravel5.7 前后端分离开发 实现基于API请求的token认证
    laravel 自动加载 自定义的文件/辅助函数
    laravel5.7 migrate 时报错 Specified key was too long error 解决方案
    PHP 命名空间
  • 原文地址:https://www.cnblogs.com/feng0919/p/15760915.html
Copyright © 2020-2023  润新知