golang snmp開發學習筆記(一)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

概述

  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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.