安装pysnmp:
编译安装的话,pysnmp需要用到asn.1,安装pysnmp的话需要先安装asn.1,不过我没有安装成功。
也可以使用easy_install pysnmp安装,不过我也没用安装成功,用的是mac,总是提示找不到编译器。
用mac很多东西都装不上,当然原因是我比较菜,并没用攻击mac的意思,而且我也不喜欢因为装个软件忙活半天,我就装了个ubuntu的虚拟机。
在ubuntu上使用apt-get安装, 软件包名称是python-pysnmp-se或者python-snmp-common。一条命令就搞定了。
在pysnmp里分别用getCmd,setCmd,nextCmd对应snmp里的get-request,set-request,get-next-request报文,pysnmp做的是snmp的管理进程,所以没有trap,get-response报文的定义。pysnmp里还有一个bulkCmd命令,和nextCmd差不多。
比较坑爹的事情发生了,下边是一段官方文档给出getCmd的示例代码,我运行了N次都是失败:
- >>> from pysnmp.entity.rfc3413.oneliner import cmdgen
- >>> errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().getCmd(
- ... cmdgen.CommunityData('my-agent', 'public', 0),
- ... cmdgen.UdpTransportTarget(('localhost', 161)),
- ... '1.3.6.1.2.1.1.1.0',
- ... '1.3.6.1.2.1.1.2.0'
- ... )
- >>> print(errorIndication)
- None
- >>> print(errorStatus)
- 0
- >>> print(varBinds)
- [(ObjectName(1.3.6.1.2.1.1.1.0), OctetString('Linux saturn 2.6.37.6-smp
-
- (ObjectName(1.3.6.1.2.1.1.2.0), ObjectIdentifier(1.3.6.1.4.1.8072.3.2.10))]
提示的内容大概意思就是元组只能和元组链接,弄了一个晚上也没搞明白怎么回事,只好放弃了。往下接着看吧,刚往下一看问题马上解决了,这是setCmd的代码:
- >>> from pysnmp.entity.rfc3413.oneliner import cmdgen
- >>> from pysnmp.proto import rfc1902
- >>> errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().setCmd(
- ... cmdgen.CommunityData('my-agent', 'public', 1),
- ... cmdgen.UdpTransportTarget(('localhost', 161)),
- ... ((1,3,6,1,2,1,1,1,0), rfc1902.OctetString('my system description'))
- ... )
- >>> print(errorIndication)
- None
- >>> print(errorStatus)
- 17
- >>> print(errorStatus.prettyPrint())
- notWritable(17)
这段代码里的mib中各个数字之间是逗号,而上边确实句号,把上边的字符串改成元组马上就ok,太TMD坑爹了,对比发现上边是两个mib,下边是一个mib,或许用字符串的形式一次可以get多个mib,但是我确实没有成功,而且经过各种实验,也没有能够实现一次获取多个mib。
还有一个比较郁闷的是官方没有给出api,只是在文档里给了一些例子,太不给力了。
其实这东西也没啥难的,就是那个错误的例子让我浪费了好多时间⋯⋯⋯⋯