Go 连接snmp获取数据

使用Go语言可以来连接snmp,监控开放snmp服务的主机的数据。使用的第三方包为gosnmp

安装

go get "github.com/alouca/gosnmp"
# 或者使用gopm
gopm get -v -g -u "github.com/alouca/gosnmp"

使用实例

简单使用:

package main

import (
    "github.com/alouca/gosnmp"
    "fmt"
)

func main()  {
    # 连接
    s, err := gosnmp.NewGoSNMP("192.168.3.111:161", "public", gosnmp.Version2c, 5)
    if err != nil {
        fmt.Println(err.Error())
    }
    # get 方式获取数据
    resp, err := s.Get(".1.3.6.1.2.1.1.1.0")
    if err == nil {
        for _, v := range resp.Variables {
            fmt.Print(v.Name + " --> ")
            fmt.Println(v.Value)
        }
    } else {
        fmt.Println(err.Error())
    }
}

输出结果

$ go run test.go
.1.3.6.1.2.1.1.1.0 --> Linux localhost.localdomain 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64

详细的snmp oid表可查看http://www.ttlsa.com/monitor/snmp-oid/

snmp oid中不但了Get方式的获取,还有一种Walk,返回一串数据。

walk方式

package main

import (
    "github.com/alouca/gosnmp"
    "fmt"
)

func main()  {
    s, err := gosnmp.NewGoSNMP("192.168.3.111:161", "public", gosnmp.Version2c, 5)
    if err != nil {
        fmt.Println(err.Error())
    }
    # walk 方式获取数据
    result, err := s.Walk(".1.3.6.1.2.1.2.2.1.2")
    if err == nil {
        for _, v := range result {
            fmt.Print(v.Name + " --> ")
            fmt.Println(v.Value)
        }
    }
}

输出:

$ go run src/test.go
.1.3.6.1.2.1.2.2.1.2.1 --> lo
.1.3.6.1.2.1.2.2.1.2.2 --> ens32

Last updated

Was this helpful?