Nagios Core 4.4.3 SNMP陷阱脚本执行报错External command error: Command failed 如何解决?
解决Nagios Core 4.4.3中SNMP陷阱脚本的"External command error: Command failed"报错
我来帮你排查这个Nagios处理SNMP陷阱时的外部命令错误问题。这个报错通常和权限配置、路径准确性或者SELinux限制有关,咱们一步步来解决:
1. 检查命令文件的权限与归属
nagios.cmd的权限是最常见的问题,因为运行snmptrapd的用户需要能写入这个文件才能传递命令给Nagios。
- 先查看文件的归属和权限:
正常情况下,这个文件应该属于ls -l /var/spool/nagios/cmd/nagios.cmdnagios:nagcmd(或类似的组,具体看你的Nagios配置)。 - 如果
snmptrapd的运行用户(通常是snmp)不在nagcmd组里,添加进去:usermod -aG nagcmd snmp - 确保文件有组写入权限:
chmod g+w /var/spool/nagios/cmd/nagios.cmd - 最后重启相关服务生效:
systemctl restart snmptrapd nagios
2. 验证脚本的路径与参数格式
脚本里的配置错误也会导致命令执行失败:
- 确认
CommandFile路径正确:打开Nagios主配置文件nagios.cfg,查找command_file参数,确保脚本里的路径和配置一致(有些系统可能会把命令文件放在/var/lib/nagios/rw/nagios.cmd)。 - 检查参数传递是否符合要求:
PROCESS_SERVICE_CHECK_RESULT的格式必须是[timestamp] PROCESS_SERVICE_CHECK_RESULT;host_name;service_description;return_code;output。你可以临时在脚本开头加一行调试代码,查看snmptrapd实际传递的参数:
触发一个SNMP陷阱后,查看echo "Received parameters: $@" >> /tmp/trap_debug.log/tmp/trap_debug.log,确认是否有4个有效参数传递过来。
3. 排查SELinux限制
如果你的系统开启了SELinux,它可能会阻止snmptrapd写入Nagios的命令文件:
- 先临时关闭SELinux测试:
触发陷阱后如果报错消失,说明SELinux是问题根源。setenforce 0 - 添加SELinux规则允许写入:
semanage fcontext -a -t nagios_cmd_t "/var/spool/nagios/cmd/nagios.cmd" restorecon -v /var/spool/nagios/cmd/nagios.cmd - 如果还有其他权限问题,可以用audit日志生成规则:
grep snmptrapd /var/log/audit/audit.log | audit2allow -M mysnmp semodule -i mysnmp.pp
4. 手动测试脚本本身
最后验证脚本的执行权限和语法:
- 确保脚本有执行权限:
chmod +x /path/to/your/trap_script.sh - 手动模拟调用脚本,看是否能成功写入命令文件:
然后查看./trap_script.sh test_host test_service 0 "Test SNMP trap output"nagios.cmd里是否新增了这条命令,同时检查Nagios日志/var/log/nagios/nagios.log是否有相关记录。如果手动运行也报错,检查echocmd的路径是否正确(可以用which echo确认/bin/echo是否存在)。
内容的提问来源于stack exchange,提问作者user3069396
相关产品推荐
相关产品推荐

