gosnmp
GoSNMP是一个完全用Go编写的SNMP客户端库。它提供了Get,
GetNext, GetBulk, Walk, BulkWalk, Set和Traps。它支持IPv4和
IPv6,使用SNMPv1、SNMPv2c或SNMPv3。
linux/amd64和linux/386进行了构建测试。
关于
gosnmp由Andreas Louca开始,然后
,由Sonia Hamilton完全重写
(2012-2020),现在所有权已经转移到社区
gosnmp/gosnmp。
如需支持和帮助,请加入我们在
Gophers Slack的#snmp频道。
概述
GoSNMP具有以下SNMP功能。
- 获取(单个或多个OID)
- 获取下一个
- GetBulk(仅SNMPv2c和SNMPv3)
- Walk- 使用GETNEXT检索一个子树的值。
- BulkWalk- 使用GETBULK检索一个子树的值(仅SNMPv2c和
SNMPv3)。 - BulkWalkAll- 类似于BulkWalk,但是返回一个包含所有值的填充数组,而不是使用回调函数来流转结果。
- Set- 支持整数和八位数字符串。
- SendTrap- 发送SNMP TRAPs。
- Listen- 作为一个NMS来接收TRAPs。
GoSNMP有以下帮助函数。
- ToBigInt- 将返回的值视为
*big.Int - Partition- 便于划分大的OID片断
gosnmp/gosnmp已经完全脱离了alouca/gosnmp,你的代码
,需要在这些(和其他)地方进行修改。
- Get函数有一个不同的方法签名
- NewGoSNMP函数已被删除,使用Connect代替
(见下面的用法)。Connect使用GoSNMP结构;
gosnmp.Default是提供给你使用的。 - GoSNMP不再依赖alouca/gologger- 如果你的
记录器符合gosnmp.LoggerInterface接口,你可以使用它;否则
调试将被禁用。
type
要启用日志,你必须调用gosnmp.NewLogger()函数,并传递一个指向你的日志接口的指针,例如用标准的*log.Logger。
gosnmp
或
g
你可以使用golang build标签 "gosnmp_nodebug "从你的应用程序中完全删除日志代码,例如。
go build -tags gosnmp_nodebug
这将完全禁用gosnmp库的日志记录,即使在代码中指定了logger接口。这提供了一个小的性能改进。
安装
go get github.com/gosnmp/gosnmp
文档
使用方法
下面是examples/example/main.go ,演示了如何使用GoSNMP。
// Default is a pointer to a GoSNMP struct that contains sensible defaults
运行这个例子得到以下输出(来自我的打印机)。
% go run example.go
0: oid: 1.3.6.1.2.1.1.4.0 string: Administrator
1: oid: 1.3.6.1.2.1.1.7.0 number: 104
examples/example2.go类似于 ,但是它使用了一个 自定义的 ,而不是example.go
&GoSNMPg.Defaultexamples/walkexample.go演示了使用BulkWalkexamples/example3.go示范了SNMPv3examples/trapserver.go示范编写一个SNMP v2c陷阱服务器
MIB解析器
我没有任何计划写一个MIB解析器。其他人建议
github.com/sleepinggen…
贡献
欢迎投稿,尤其是有数据包捕获的投稿(见下文
)。
如果你从来没有为Go项目贡献过,这里有一个工作流程的例子。
- 在GitHub网页上叉开这个 repo
go get github.com/gosnmp/gosnmpcd $GOPATH/src/github.com/gosnmp/gosnmpgit remote rename origin upstreamgit remote add origin [[email protected]](https://golangexample.com/cdn-cgi/l/email-protection):<your-github-username>/gosnmp.gitgit checkout -b developmentgit push -u origin development(设置推送位置,检查是否正常)
数据包抓取
按以下方式创建你的数据包捕获。
预期的输出,通过snmp命令获得。比如说。
% snmpget -On -v2c -c public 203.50.251.17 1.3.6.1.2.1.1.7.0 \
1.3.6.1.2.1.2.2.1.2.6 1.3.6.1.2.1.2.2.1.5.3
.1.3.6.1.2.1.1.7.0 = INTEGER: 78
.1.3.6.1.2.1.2.2.1.2.6 = STRING: GigabitEthernet0
.1.3.6.1.2.1.2.2.1.5.3 = Gauge32: 4294967295
数据包捕获,在运行snmpget时获得。例如:
sudo tcpdump -s 0 -i eth0 -w foo.pcap host 203.50.251.17 and port 161
漏洞
Rane的文件SNMP:简单?网络管理
协议,在学习SNMP
协议时很有用。
请在
Github上创建一个带有数据包捕获的问题(将捕获上传至Google Drive、Dropbox或类似的
),其中包含缺少BER类型的样本,或你发现的任何其他bug
。如果可能的话,请包括2或3个丢失/有问题的BER类型的例子
。
以下BER类型已经实现。
- 0x00 未知类型
- 0x01 布尔型
- 0x02 整数
- 0x03 BitString
- 0x04 八位数字符串
- 0x05 空值
- 0x06 对象标识符
- 0x07 对象描述
- 0x40 IPAddress (IPv4 & IPv6)
- 0x41 计数器32
- 0x42 Gauge32
- 0x43 TimeTicks
- 0x44 不透明 (浮点数和双数)
- 0x45 NsapAddress
- 0x46 Counter64
- 0x47 Uinteger32
- 0x78 不透明的浮点
- 0x79 不透明的双数
- 0x80 NoSuchObject
- 0x81 NoSuchInstance
- 0x82 EndOfMibView
运行测试
在Docker中进行本地测试
docker build -t gosnmp/gosnmp:latest
或
export
测试分组如下。
- 单元测试(验证数据打包和编排)。
marshal_test.gomisc_test.go
- 公共API一致性测试。
gosnmp_api_test.go
- 端到端集成测试。
generic_e2e_test.go
通用的端到端集成测试generic_e2e_test.go ,应该对任何符合SNMP MIB-2的主机(如路由器、NAS盒、打印机)进行
。
Mocks的生成是使用。
mockgen -source=interface.go -destination=mocks/gosnmp_mock.go -package=mocks
但是目前已经删除了,因为它们会破坏linting。
剖析cpu的使用。
go
剖析内存使用情况。
go
检查测试覆盖率。
go get github.com/axw/gocov/gocov
go get github.com/matm/gocov-html
gocov
许可证
部分代码来自Golang项目(特别是一些用于解除误码率响应的
函数),其条款与Go语言的
和条件相同。其余的代码采用BSD
许可证。
更多细节请参见LICENSE文件。
其余代码的版权归GoSNMP作者所有 - 作者名单见
AUTHORS.md。