golang snmp开发学习笔记(一)
来源:互联网 发布:仿手写软件app 编辑:程序博客网 时间:2024/05/18 01:48
概述
soniah/gosnmp是一个纯go语言编写的SNMP包,基于alouca/gosnmp开发。目前提供GetRequest、GetNext、GetBulk、Walk和SetRequest功能,支持IPv4和IPv6, 支持SNMPv2c和SNMPv3。gosnmp还在开发,目前不支持Trap,Walk和SetRequest也还不够完善,但作为一般的网络监控用途已经足够,如果需要还可以直接对源码进行修改补充。
本文介绍soniah/gosnmp的GetRequest、GetNext和GetBulk操作。
资源
- 文档: https://godoc.org/github.com/soniah/gosnmp
- 源码: https://github.com/soniah/gosnmp
安装
go get github.com/soniah/gosnmp
范例 1. GetRequest
package mainimport ( "fmt" "log" g "github.com/soniah/gosnmp")func main() { // Default is a pointer to a GoSNMP struct that contains // sensible defaults eg port 161, community public, etc g.Default.Target = "172.18.0.2" g.Default.Community = "community" err := g.Default.Connect() if err != nil { log.Fatalf("Connect() err: %v", err) } defer g.Default.Conn.Close() oids := []string{"1.3.6.1.2.1.1.5.0","1.3.6.1.2.1.1.7.0"} result, err := g.Default.Get(oids) // Get() accepts up to g.MAX_OIDS if err != nil { log.Fatalf("Get() err: %v", err) } for i, v := range result.Variables { fmt.Printf("%d. oid: %s ", i, v.Name) // the Value of each variable returned by Get() implements // interface{}. You could do a type switch... switch v.Type{ case g.OctetString: fmt.Printf("string: %s\n", string(v.Value.([]byte))) default: // ... or often you're just interested in numeric values. // ToBigInt() will return the Value as a BigInt, for plugging // into your calculations. fmt.Printf("number: %d\n", g.ToBigInt(v.Value)) } }}
输出结果:
0. oid: .1.3.6.1.2.1.1.5.0 string: YD_WLZX1F_S26521. oid: .1.3.6.1.2.1.1.7.0 number: 3
范例 2. 自己构造GoSNMP结构
package mainimport ( "fmt" "log" "time" g "github.com/soniah/gosnmp")func main() { // build our own GoSNMP struct, rather than using g.Default snmp := &g.GoSNMP{ Target: "172.18.0.2", Port: 161, Community: "community", Version: g.Version2c, Timeout: time.Duration(2) * time.Second, } 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","1.3.6.1.2.1.1.7.0"} result, err := snmp.Get(oids) if err != nil { log.Fatalf("Get() err: %v", err) } 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)) } } }
输出结果:
0. oid: .1.3.6.1.2.1.1.5.0 string: YD_WLZX1F_S26521. oid: .1.3.6.1.2.1.1.7.0 number: 3
范例 3. SNMPv3
package mainimport ( "fmt" "log" "time" g "github.com/soniah/gosnmp")func main() { snmp := &GoSNMP{ Target: "172.17.0.10", Port: 161, Community: "community", Version: g.Version3, Timeout: time.Duration(30) * time.Second, SecurityModel: g.UserSecurityModel, MsgFlags: g.AuthPriv, //认证且加密 SecurityParameters: &g.UsmSecurityParameters { UserName: "user", AuthenticationProtocol: g.SHA, AuthenticationPassphrase: "password", PrivacyProtocol: g.DES, PrivacyPassphrase: "password", }, } 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","1.3.6.1.2.1.1.7.0"} result, err := snmp.Get(oids) if err != nil { log.Fatalf("Get() err: %v", err) } 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)) } } }
todo: 范例3代码未验证。
范例 4. GetNext
package mainimport ( "fmt" "log" g "github.com/soniah/gosnmp")func main() { g.Default.Target = "172.18.0.2" g.Default.Community = "community" err := g.Default.Connect() if err != nil { log.Fatalf("Connect() err: %v", err) } defer g.Default.Conn.Close() oids := []string{"1.3.6.1.2.1.1.5", "1.3.6.1.2.1.2.2.1.10"} result, err := g.Default.GetNext(oids) if err != nil { log.Fatalf("Get() err: %v", err) } 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)) } }}
输出结果:
0. oid: .1.3.6.1.2.1.1.5.0 string: YD_WLZX1F_S26521. oid: .1.3.6.1.2.1.2.2.1.10.1 number: 144611
范例 5. GetBulk
package mainimport ( "fmt" "log" g "github.com/soniah/gosnmp")func main() { g.Default.Target = "172.18.0.2" g.Default.Community = "community" err := g.Default.Connect() if err != nil { log.Fatalf("Connect() err: %v", err) } defer g.Default.Conn.Close() oids := []string{ "1.3.6.1.2.1.1.2", //sysObjectID "1.3.6.1.2.1.1.5", //sysName "1.3.6.1.2.1.2.2.1.1", //ifIndex "1.3.6.1.2.1.2.2.1.10", //ifInOctets "1.3.6.1.2.1.2.2.1.16", //ifOutOctets } //前2个oid不重复,后3个重复10次,相当于执行5次GetNext result, err := g.Default.GetBulk(oids, 2, 5) if err != nil { log.Fatalf("Get() err: %v", err) } for i, v := range result.Variables { fmt.Printf("%d: %s = ", i, v.Name) switch v.Type{ case g.OctetString: fmt.Printf("%s\n", string(v.Value.([]byte))) default: fmt.Printf("%d\n", g.ToBigInt(v.Value)) } } }
输出结果:
0: .1.3.6.1.2.1.1.2.0 = 01: .1.3.6.1.2.1.1.5.0 = YD_WLZX1F_S26522: .1.3.6.1.2.1.2.2.1.1.1 = 13: .1.3.6.1.2.1.2.2.1.10.1 = 1446114: .1.3.6.1.2.1.2.2.1.16.1 = 5393062845: .1.3.6.1.2.1.2.2.1.1.2 = 26: .1.3.6.1.2.1.2.2.1.10.2 = 07: .1.3.6.1.2.1.2.2.1.16.2 = 08: .1.3.6.1.2.1.2.2.1.1.3 = 39: .1.3.6.1.2.1.2.2.1.10.3 = 7068863010: .1.3.6.1.2.1.2.2.1.16.3 = 21629162111: .1.3.6.1.2.1.2.2.1.1.4 = 412: .1.3.6.1.2.1.2.2.1.10.4 = 12977739113: .1.3.6.1.2.1.2.2.1.16.4 = 105272644314: .1.3.6.1.2.1.2.2.1.1.5 = 515: .1.3.6.1.2.1.2.2.1.10.5 = 16973322216: .1.3.6.1.2.1.2.2.1.16.5 = 641244267
0 0
- golang snmp开发学习笔记(一)
- golang snmp开发学习笔记(二)
- Golang学习笔记 (一)
- snmp学习笔记——配置使用trap(一)
- net-snmp学习笔记<一> — 介绍
- golang学习笔记之并发优化(一)
- Golang---walk学习(一)
- snmp++开发实例一
- SNMP学习一
- Snmp学习笔记
- SNMP学习笔记
- SNMP的学习笔记
- Snmp学习笔记
- snmp学习笔记
- Snmp学习笔记
- Snmp学习笔记
- Snmp学习笔记
- SNMP的学习笔记
- Linux下paste命令详解
- 例题5.16 Halum操作 UVa11478
- ocp-58
- 并发访问数据可能存在的问题
- 关于LDR链接器脚本所产生的2B错误
- golang snmp开发学习笔记(一)
- java 网络编程——day23
- ocp-59
- 连续子串最大最小异或值 Trie+Xor LightOJ 1269 Consecutive Sum
- ocp-60
- ocp-61
- 欢迎使用CSDN-markdown编辑器
- 大话设计模式一:代码无错就是优----简单工厂模式
- Comparable与Comparator的区别