Zabbix调用NMAP端口检测脚本返回空值问题排查求助
问题:Zabbix调用NMAP端口检测脚本返回空值排查
我写了一个用NMAP检测端口的简单脚本,端口开放时返回1,关闭时返回0。在Zabbix中创建监控项调用该脚本,通过CLI以root和zabbix用户执行都正常,无权限问题;但通过Zabbix UI执行测试时,无报错却返回空值,请求协助排查原因。
脚本代码(zabbix-nmap.sh)
#!/bin/bash PORT=$(nmap $1 -p $2) SUB='open' if [[ "$PORT" == *"$SUB"* ]]; then echo 1 else echo 0 fi
Zabbix监控项相关说明
- Zabbix监控项测试界面
- Zabbix监控项配置界面
排查方向建议
1. 修复路径依赖问题
Zabbix Agent执行脚本时,可能找不到nmap的位置,或者脚本本身路径没写全:
- 把脚本里的
nmap替换成绝对路径(可用which nmap查询实际路径,比如/usr/bin/nmap) - 在Zabbix监控项的用户参数里,指定脚本的完整绝对路径,不要用相对路径
2. 统一环境变量
CLI的环境变量和Zabbix Agent运行的环境变量存在差异,比如PATH不包含nmap所在目录。可以在脚本开头添加:
export PATH=$PATH:/usr/bin
或者直接用nmap的绝对路径,彻底规避环境变量问题。
3. 优化脚本输出逻辑
脚本执行时可能产生stderr输出,干扰Zabbix捕获stdout,同时nmap默认输出格式不稳定:
- 把nmap命令的stderr重定向到/dev/null:
PORT=$(nmap $1 -p $2 2>/dev/null) - 改用更稳定的grepable输出格式,避免默认输出的格式变动导致匹配失败,同时跳过主机存活检测减少冗余输出:
PORT=$(nmap -Pn -p $2 $1 -oG - 2>/dev/null)
4. 检查Zabbix Agent配置
- 确认
zabbix_agentd.conf中的UnsafeUserParameters是否设置为1,自定义用户参数需要开启这个选项才能执行脚本 - 检查用户参数的格式是否正确,示例:
修改配置后记得重启Zabbix Agent服务。UserParameter=port.check[*],/绝对路径/zabbix-nmap.sh $1 $2
5. 排查SELinux限制
虽然CLI执行正常,但Zabbix Agent运行可能受SELinux约束:
- 临时执行
setenforce 0关闭SELinux,再测试Zabbix UI的监控项 - 如果测试正常,需要给脚本添加SELinux上下文规则,示例:
semanage fcontext -a -t zabbix_agent_exec_t "/脚本绝对路径/zabbix-nmap.sh" restorecon -v "/脚本绝对路径/zabbix-nmap.sh"
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

