转载请注明出处:
OID(Object Identifier)是一种用于标识和唯一命名管理信息库中的对象的标准方式。给定一个OID,可以确定特定的管理信息库对象,并对其进行操作。
go语言使用snmp库中的 k-sone/snmpgo 实现相关mib查询的代码如下:
- package main
- import (
- "fmt"
- "log"
- "net"
-
- "github.com/k-sone/snmpgo"
- )
- func main() {
- // 创建SNMP会话
- session := snmpgo.NewSNMP(goSNMP.Version2c, 5000000, snmpgo.Default)
- err := session.Open()
- if err != nil {
- log.Fatalf("无法打开SNMP会话:%v", err)
- }
- defer session.Close()
- // 设置SNMP目标
- target := &snmpgo.SNMPTarget{
- Address: "localhost",
- Port: 161,
- Community: "public",
- Version: snmpgo.Version2c,
- }
- // 创建SNMP GET请求
- pdu := snmpgo.NewPdu(snmpgo.GetRequest)
- pdu.AddOid(snmpgo.MustParseOid("1.3.6.1.2.1.55.1.7.1.5"))
- // 发送SNMP请求
- packet, err := pdu.Marshal()
- if err != nil {
- log.Fatalf("SNMP请求封包失败:%v", err)
- }
- result, err := session.GetBulk(packet, target)
- if err != nil {
- log.Fatalf("SNMP GET请求失败:%v", err)
- }
- // 处理SNMP响应
- if result.ErrorStatus() != snmpgo.NoError {
- log.Fatalf("SNMP响应错误:%s", result.ErrorStatus())
- }
- // 解析SNMP响应
- respPdu := result.PduAtIndex(0)
- if respPdu == nil {
- log.Fatal("未收到SNMP响应")
- }
- // 获取系统启动时间的值
- startupTime := respPdu.VariableBindings()[0].Variable.String()
- fmt.Printf("系统启动时间:%s\n", startupTime)
- }
上述代码中,使用了snmpgo
库来进行SNMP通信。首先,创建了一个SNMP会话,并设置SNMP目标的地址、端口和共同体(community)。然后,我们创建了一个GET请求,并将要获取的OID添加到请求中。接下来,发送SNMP请求,并处理响应。如果请求成功,我们从响应中解析出系统启动时间的值并打印出来。
请注意,在运行此示例之前,确保已经安装了 snmpgo
库(可以通过 go get github.com/k-sone/snmpgo
进行安装)以及有可用的 SNMP 代理服务器。