英文:
gosnmp get octetstring from SNMP PDU
问题
我正在尝试从gosnmp
包返回的SNMP PDU中获取OctetString
值。即使只有字节也可以。
以下是我的代码:
package snmp_abstract
import (
"github.com/soniah/gosnmp"
"time"
"log"
"os"
"strings"
)
type Switch struct {
Hostname string
Connection gosnmp.GoSNMP
}
var ConnectionParams = &gosnmp.GoSNMP{
Target: "",
Port: 161,
Community: "community",
Version: gosnmp.Version2c,
Timeout: time.Duration(5) * time.Second,
Logger: log.New(os.Stdout, "", 0),
}
type Mibs struct {
VtpVlanState,
Dot1dBasePortIfIndex string
}
var Default = &Mibs{
VtpVlanState: "1.3.6.1.4.1.9.9.46.1.3.1.1.2",
Dot1dBasePortIfIndex: "1.3.6.1.2.1.17.1.4.1.2",
}
func SNMPGet(conn *gosnmp.GoSNMP, host string, mib []string) {
conn.Target = host
log.Println(conn)
err := conn.Connect()
if err != nil {
log.Printf("Unable to connect to %s\n", host)
}
defer conn.Conn.Close()
res, err := conn.Get(mib)
if err != nil {
log.Println("GET error")
log.Print(err)
}
log.Println(res)
}
func SNMPWalk(conn *gosnmp.GoSNMP, host string, mib string) []gosnmp.SnmpPDU {
conn.Target = host
log.Println(conn)
err := conn.Connect()
if err != nil {
log.Printf("Unable to connect to %s\n", host)
}
defer conn.Conn.Close()
res, err := conn.BulkWalkAll(mib)
if err != nil {
log.Println("GET error")
log.Print(err)
}
return res
}
func (sw *Switch) Vlans() []string {
res := SNMPWalk(&sw.Connection, sw.Hostname, Default.VtpVlanState)
var vlans = make([]string, len(res))
for i, vlan := range res {
oidSlice := strings.Split(vlan.Name, ".")
v := oidSlice[len(oidSlice)-1]
vlans[i] = v
}
return vlans
}
func (sw *Switch) MapBPIIfindex(vlan string) {
log.Println(vlan)
s := *sw
s.Connection.Community += "@" + vlan
log.Println(s.Connection.Community)
res := SNMPWalk(&s.Connection, s.Hostname, Default.Dot1dBasePortIfIndex)
for _, p := range res {
log.Println(p.Name)
log.Println(p.Value)
}
}
当我使用MapBPIIfindex
方法时,我得到以下输出:
OID: [.1.3.6.1.2.1.31.1.1.1.1.10001]
[decodeValue: type is OctetString]
decodeValue: value is []interface {}{[]uint8{0x46, 0x61, 0x30, 0x2f, 0x31}}
现在,这应该包含一个OctetString
。uint8字节应该解码为Fa0/1
,但我无法做到这一点。
当我将log.Println(p.Value)
更改为log.Println(p.Value.([]uint8))
时,我得到以下错误:
2017/05/29 12:54:59 .1.3.6.1.2.1.17.1.4.1.2
panic: interface conversion: interface {} is nil, not []uint8
我该如何获取这个值?文档对此并不是很清楚。
英文:
I am trying to get the OctetString
value from an SNMP PDU returned by the gosnmp
package. Even the bytes would suffice.
Here is my code:
package snmp_abstract
import (
"github.com/soniah/gosnmp"
"time"
"log"
"os"
"strings"
)
type Switch struct {
Hostname string
Connection gosnmp.GoSNMP
}
var ConnectionParams = &gosnmp.GoSNMP{
Target: "",
Port: 161,
Community: "community",
Version: gosnmp.Version2c,
Timeout: time.Duration(5) * time.Second,
Logger: log.New(os.Stdout, "", 0),
}
type Mibs struct {
VtpVlanState,
Dot1dBasePortIfIndex string
}
var Default = &Mibs{
VtpVlanState: "1.3.6.1.4.1.9.9.46.1.3.1.1.2",
Dot1dBasePortIfIndex: "1.3.6.1.2.1.17.1.4.1.2",
}
func SNMPGet(conn *gosnmp.GoSNMP, host string, mib []string) {
conn.Target = host
log.Println(conn)
err := conn.Connect()
if err != nil {
log.Printf("Unable to connect to %s\n", host)
}
defer conn.Conn.Close()
res, err := conn.Get(mib)
if err != nil {
log.Println("GET error")
log.Print(err)
}
log.Println(res)
}
func SNMPWalk(conn *gosnmp.GoSNMP, host string, mib string) []gosnmp.SnmpPDU {
conn.Target = host
log.Println(conn)
err := conn.Connect()
if err != nil {
log.Printf("Unable to connect to %s\n", host)
}
defer conn.Conn.Close()
res, err := conn.BulkWalkAll(mib)
if err != nil {
log.Println("GET error")
log.Print(err)
}
return res
}
func (sw *Switch) Vlans() []string {
res := SNMPWalk(&sw.Connection, sw.Hostname, Default.VtpVlanState)
var vlans = make([]string, len(res))
for i, vlan := range res {
oidSlice := strings.Split(vlan.Name, ".")
v := oidSlice[len(oidSlice)-1]
vlans[i] = v
}
return vlans
}
func (sw *Switch) MapBPIIfindex(vlan string) {
log.Println(vlan)
s := *sw
s.Connection.Community += "@" + vlan
log.Println(s.Connection.Community)
res := SNMPWalk(&s.Connection, s.Hostname, Default.Dot1dBasePortIfIndex)
for _, p := range res {
log.Println(p.Name)
log.Println(p.Value)
}
}
When I use the MapBPIIfindex
method I get the following output:
OID: [.1.3.6.1.2.1.31.1.1.1.1.10001]
[decodeValue: type is OctetString]
decodeValue: value is []interface {}{[]uint8{0x46, 0x61, 0x30, 0x2f, 0x31}}
Now, this should contain an OctetString
. The uint8 bytes should decode to Fa0/1
, but I am not able to do this.
When I change log.Println(p.Value)
to log.Println(p.Value.([]uint8))
, I get the following error:
2017/05/29 12:54:59 .1.3.6.1.2.1.17.1.4.1.2
panic: interface conversion: interface {} is nil, not []uint8
How can I get this value? The documentation is not so clear on this.
答案1
得分: 1
这是ASCII码。你需要将你的十六进制输出转换一下。
我对GO语言没有任何了解。
https://en.wikipedia.org/wiki/ASCII
英文:
this is ASCII. You need to convert your HEX output.
I don't have any knowledge of GO.
https://en.wikipedia.org/wiki/ASCII
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论