# Go 连接snmp获取数据

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

## 安装

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

## 使用实例

**简单使用：**

```go
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())
    }
}
```

输出结果

```bash
$ 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方式**

```go
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)
        }
    }
}
```

输出：

```bash
$ 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
```
