接触到pysnmp是因为项目中需要捕获一硬件设备发出来的snmp trap,并针对不同的event trap作出反应(声音告警、执行一些命令)。
pysnmp是“SNMP framework for Python”,可以让我们在Python的环境下捕获snmp trap,还有snmpset,snmpwalk,snmpget等。

pysnmp和pysnmp-apps的安装
pysnmp的安装就是解压出来的pysnmp目录放到c:\Python23\Lib\site-packages\
建议也下载pysnmp-apps-0.0.2.tar.gz,这个文件包括一些pysnmp的简单工具,相当于例程。将解压出来的pysnmpap目录放到c:\Python23\Lib\site-packages\

使用
pysnmp-apps-0.0.2.tar.gz里面有pysnmptrapd.py和pysnmptrap.py两个文件,一个收一个发。
用以下命令可以查看使用帮助:

# python pysnmptrapd.py -h
# python pysnmptrap.py -h



用以下命令接受snmp traps:
# python pysnmptrapd.py -f -o mysnmp.log  192.168.0.1:162
如果在Unix,不加-f就使pysnmptrapd.py以deamon的方式运行。因为是在Windows上执行,在Windows里pysnmptrapd.py无法用deamon方式运行,需要-f参数。-o mysnmp.log表示收到的snmp trap写到mysnmp.log这个文件。192.168.0.1是我运行pysnmptrapd.py的Windows机器的IP地址,162是接收snmp trap的udp端口。这些参数是针对我这个项目的环境的。
记得在设备上将snmp trap的destination地址设为192.168.0.1,这样就可以收到snmp traps了。

用以下命令发送snmp traps:
# python pysnmptrap.py 192.168.0.1:162 -c public .1.3.6.1.4.1.2.3.1.2.1.2 a 192.168.0.250 0 0
192.168.0.1:162是发送目标地址和端口,public是community,.1.3.6.1.4.1.2.3.1.2.1.2是enterprise-OID,a 192.168.0.250表示发送端地址(Agent Addr)是192.168.0.250,最后Generic Trap是0,Specific Trap也是0

对收到的snmp trap作出反应用以下命令让pysnmptrapd.py收到snmp trap后调用myEventTrapHandler.py作出反应:
# python pysnmptrapd.py -f -o mysnmp.log  -p myEventTrapHandler.py 192.168.0.1:162

查看pysnmptrapd.py的代码就知道有哪些参数传递给myEventTrapHandler.py

我修改了pysnmptrapd.py,使传递的参数符合我的需要,也改变了pysnmptrapd.py的一些参数缺省值,使这些缺省值适合项目环境。

总结使用过pysnmp之后,发现利用pysnmp捕获snmp trap并作出反应是很轻松的事。现在我的Python程序可以捕获snmp trap,针对不同的trap播放WAV文件告警、执行一些命令,达到了预期的目标。