*. 如何确认windows能否接受到设备发的trap?
阅读设备文档,确保操作能让设备产生trap,然后在计算机上用Wireshark捕捉SNMP消息。
* 用NET-SNMP如何捕捉trap?
** 怎样让net-snmp收到trap?
C:/Program Files/Net-SNMP/usr/bin>snmptrapd -f -Le -d
执行之后NET-SNMP开始接收trap,注意这是debug模式,会将收到的trap包内容打印出。
** 碰到错误couldn't open udp:162 -- errno 2 ("No such file or directory")?
碰到此错误很可能是有程序占用了windows的SNMP接受端口(162)。用下面命令来找出占用此端口的进程。
netstat -ano|find "162"
如果有输出则最后一个数字是进程号。从微软免费下一个Process Explorer,找出占用该端口的进程,决定是否停掉。
** 碰到错误 Warning: no access control information configured. This receiver will *NOT* accept any incoming notifications.
没有设定访问控制的情况下NET-SNMP对所有的进入trap都丢掉。因为一个snmp manager可能收到大量的trap而其中只有一小部分是真正需要处理的。具体设置可以通过net-snmp安装目录下的bin/snmpconf.bat来实现(用此方法需要保证计算机上已安装ActivePerl);或者参照docs/Net-SNMP.chm->configuratoin->snmptrapd.conf->Access Control中的描述来手工修改。
**举例,最简单的设定的步骤(对所有的都不丢):
1.建一个snmptrapd.conf并在此文件中加入下面这行配置。
disableAuthorization yes
2. 在运行snmptrapd的时候加入读取配置文件的参数。e.g.
C:/Program Files/Net-SNMP/usr/bin>snmptrapd -c "C:/Program Files/Net-SNMP/usr/bin/snmptrapd.conf" -f -Le -d
现在收到trap之后,会发现消息已经被尽可能地解开。
* 如何调用其他windows程序来处理net-snmp捕捉到的trap?
1.在上面生成的文件中,加入下面配置
traphandle default <program>
**举例:
编写下面批处理文件test.bat:
@echo off
echo. >> c:/temp/log.txt
echo %date% %time% >> c:/temp/log.txt
set /P host=%=%
set /P ip=%=%
set /P oid=%=%
set /P val=%=%
echo TRAP: host=%host%; ip=%ip%; %oid% = %val%; >> c:/temp/log.txt
然后在snmptrapd.conf中加入
traphandle default c:/temp/test.bat
那么net-snmp在收到trap时会执行test.bat,打开c:/temp/log.txt会发现有记录在内