pysnmp学习(一)

来源:互联网 发布:linux修改时间 编辑:程序博客网 时间:2024/05/17 02:04

安装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     #2 SMP Sat Apr 9 23:39:07 CDT 2011 i686')), (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,只是在文档里给了一些例子,太不给力了。


其实这东西也没啥难的,就是那个错误的例子让我浪费了好多时间⋯⋯⋯⋯




原创粉丝点击