如何按SNMP社区执行对应脚本?提取SNMP社区值遇阻求助
按SNMP社区字符串分发陷阱到不同处理脚本的配置方案
问题背景
现有snmptrapd.conf配置如下:
authCommunity log,execute public authCommunity log,execute snmpcommunityA authCommunity log,execute snmpcommunityB traphandle default /usr/bin/perl /usr/local/sbin/snmpaction.pl
需要实现:收到snmpcommunityA的陷阱时运行snmpactionA.pl,收到snmpcommunityB时运行snmpactionB.pl,同时解决日志中无法查看接收社区值的问题。
正确的snmptrapd配置写法
分社区配置traphandle
注意规则顺序——snmptrapd会按配置文件中的顺序匹配规则,特定社区的规则要放在默认规则前面,否则会被默认规则抢先匹配:
authCommunity log,execute public authCommunity log,execute snmpcommunityA authCommunity log,execute snmpcommunityB # 先匹配特定社区 traphandle default snmpcommunityA /usr/bin/perl /usr/local/sbin/snmpactionA.pl traphandle default snmpcommunityB /usr/bin/perl /usr/local/sbin/snmpactionB.pl # 最后匹配默认社区public traphandle default public /usr/bin/perl /usr/local/sbin/snmpaction.pl
单脚本分支处理(替代方案)
如果不想维护多个traphandle规则,可以在主脚本中通过环境变量获取社区值,分支执行对应逻辑。snmptrapd会将陷阱的社区字符串传入SNMP_COMMUNITY环境变量,Perl脚本中直接读取即可:
# snmpaction.pl 示例代码 my $community = $ENV{SNMP_COMMUNITY}; if ($community eq 'snmpcommunityA') { exec('/usr/local/sbin/snmpactionA.pl'); } elsif ($community eq 'snmpcommunityB') { exec('/usr/local/sbin/snmpactionB.pl'); } else { # 处理public或其他社区的逻辑 }
对应的配置只需保留默认traphandle:
authCommunity log,execute public authCommunity log,execute snmpcommunityA authCommunity log,execute snmpcommunityB traphandle default /usr/bin/perl /usr/local/sbin/snmpaction.pl
让日志记录SNMP社区值
要在日志中看到接收陷阱使用的社区字符串,需要启用snmptrapd的调试日志:
- 启动参数方式:启动snmptrapd时添加调试参数
snmptrapd -Lf /var/log/snmptrapd.log -d -s
-Lf指定日志文件路径-d启用调试输出,会包含社区字符串、OID等详细信息-s将陷阱信息同步记录到syslog
- 配置文件方式:在
snmptrapd.conf中添加日志配置
logOption f /var/log/snmptrapd.log logOption d
内容的提问来源于stack exchange,提问作者Nir Huri
相关产品推荐
相关产品推荐

