当前位置: 首页 > 工具软件 > pySNMP > 使用案例 >

pysnmp学习(一)

周子平
2023-12-01

安装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次都是失败:


[python]  view plain  copy
  1. >>> from pysnmp.entity.rfc3413.oneliner import cmdgen  
  2. >>> errorIndicationerrorStatuserrorIndexvarBinds = cmdgen.CommandGenerator().getCmd(  
  3. ... cmdgen.CommunityData('my-agent''public'0),  
  4. ... cmdgen.UdpTransportTarget(('localhost'161)),  
  5. ... '1.3.6.1.2.1.1.1.0',  
  6. ... '1.3.6.1.2.1.1.2.0'  
  7. ... )  
  8. >>> print(errorIndication)  
  9. None  
  10. >>> print(errorStatus)  
  11. 0  
  12. >>> print(varBinds)  
  13. [(ObjectName(1.3.6.1.2.1.1.1.0), OctetString('Linux saturn 2.6.37.6-smp   
  14.     #2 SMP Sat Apr 9 23:39:07 CDT 2011 i686')),   
  15. (ObjectName(1.3.6.1.2.1.1.2.0), ObjectIdentifier(1.3.6.1.4.1.8072.3.2.10))]  


提示的内容大概意思就是元组只能和元组链接,弄了一个晚上也没搞明白怎么回事,只好放弃了。往下接着看吧,刚往下一看问题马上解决了,这是setCmd的代码:


[python]  view plain  copy
  1. >>> from pysnmp.entity.rfc3413.oneliner import cmdgen  
  2. >>> from pysnmp.proto import rfc1902  
  3. >>> errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().setCmd(  
  4. ... cmdgen.CommunityData('my-agent''public'1),  
  5. ... cmdgen.UdpTransportTarget(('localhost'161)),  
  6. ... ((1,3,6,1,2,1,1,1,0), rfc1902.OctetString('my system description'))  
  7. ... )  
  8. >>> print(errorIndication)  
  9. None  
  10. >>> print(errorStatus)  
  11. 17  
  12. >>> print(errorStatus.prettyPrint())  
  13. notWritable(17)  


这段代码里的mib中各个数字之间是逗号,而上边确实句号,把上边的字符串改成元组马上就ok,太TMD坑爹了,对比发现上边是两个mib,下边是一个mib,或许用字符串的形式一次可以get多个mib,但是我确实没有成功,而且经过各种实验,也没有能够实现一次获取多个mib。


还有一个比较郁闷的是官方没有给出api,只是在文档里给了一些例子,太不给力了。


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

 类似资料: