gpt4 book ai didi

go - 对 SNMP 消息进行编码并从代理读取响应

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:27 26 4
gpt4 key购买 nike

我正在尝试使用 Go 向客户端发送一个非常基本的 SNMP Get 请求。我有一条 SNMP 消息,用于获取我根据 this post 手动编码为 byte slice 的 OID 1.3.6.1.2.1.1以及soniah/gosnmp .我能够将消息写入主机但无法读取响应(或未收到响应)。从 net.Conn 读取时程序挂起。这是否意味着根本没有回应?或者我尝试发送的 SNMP 消息不正确?

这是我的代码:

package main

import (
"fmt"
"io/ioutil"
"log"
"net"
"time"
)

func main() {
conn, err := net.DialTimeout("udp", "host:161", 5*time.Second)
if err != nil {
log.Fatal(err)
}
defer conn.Close()

fmt.Println(conn.RemoteAddr())

var snmpMsg []byte

// Type: Sequence, Length: 37
msg := []byte{0x30, 0x25}
snmpMsg = append(snmpMsg, msg...)

// Type: Integer, Len: 1, Val: 1 (SNMP Version 2c)
version := []byte{0x02, 0x01, 0x1}
snmpMsg = append(snmpMsg, version...)

// Type: Octet String, Len: 7, Val: "private"
community := []byte{0x04, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65}
snmpMsg = append(snmpMsg, community...)

// Type: GetRequest, Len: 23
pdu := []byte{0xa0, 0x17}
snmpMsg = append(snmpMsg, pdu...)

// Type: Integer, Len: 1, Val: 1 (Is the RequestID value supposed to be something specific?)
requestID := []byte{0x02, 0x01, 0x01}
snmpMsg = append(snmpMsg, requestID...)

// Type: Integer, Len: 1, Val: 0
errStatus := []byte{0x02, 0x01, 0x00}
snmpMsg = append(snmpMsg, errStatus...)

// Type: Integer, Len: 1, Val: 0
errIndex := []byte{0x02, 0x01, 0x00}
snmpMsg = append(snmpMsg, errIndex...)

// Type: Sequence, Len: 12
varBindList := []byte{0x30, 0x0c}
snmpMsg = append(snmpMsg, varBindList...)

// Type: Sequence, Len: 10
varBind := []byte{0x30, 0x0a}
snmpMsg = append(snmpMsg, varBind...)

// Type: Object Identifier, Len: 6, Val: 1.3.6.1.2.1.1
oid := []byte{0x06, 0x07, 0x2b, 0x06, 0x01, 0x02, 0x01, 0x01}
snmpMsg = append(snmpMsg, oid...)

// Type: Null, Len: 0
value := []byte{0x05, 0x00}
snmpMsg = append(snmpMsg, value...)

n, err := conn.Write(snmpMsg)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Message size: %d, Bytes written: %d\n", len(snmpMsg), n)

// Program hangs here; does the same with `conn.Read()`.
b, err := ioutil.ReadAll(conn)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
}

我还不需要解码响应,我更关心的是获取和阅读响应。有什么建议吗?

最佳答案

如果您可以运行 Wireshark 以在网络上监听您的请求和预期的响应,我认为这应该会为您解决问题。

如果您的请求格式不正确,您应该会看到 Wireshark 对此进行提示。如果您的 SNMP 代理因为某种原因没有响应 - 您将看不到网络上的响应。

在某些设置中,响应可能来自/到不同的 IP 地址 - 这可能是超时的原因。错误的社区名称可能是另一个原因。

关于go - 对 SNMP 消息进行编码并从代理读取响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51430073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com