這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
概述
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