zabbix_sender中主机变量$card的正确封装方法咨询
问题:Zabbix Sender使用变量作为主机名参数失败
问题场景
使用bash脚本遍历IP地址列表,通过zabbix_sender发送监控数据时,出现以下异常:
echo $card能正确输出IP地址,但用$card作为-s(主机名)参数时,请求失败- 直接写死IP地址的请求则完全正常
原脚本
#!/bin/bash cat list.txt | while read card do echo $card zabbix_sender -z 10.160.0.121 -s $card -k receive.power1 -o $rx1 zabbix_sender -z 10.160.0.121 -s 172.16.1.116 -k receive.power1 -o $rx1 done
list.txt内容
172.16.1.116 172.16.1.117 172.16.1.118 172.16.1.119
执行结果
info from server: "processed: 0; failed: 1; total: 1; seconds spent: 0.0022" sent:1; skipped:0; total:1
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.0065" sent:1; skipped:0; total:1
解决方案
1. 修正read命令并给变量加双引号
问题核心是read读取时可能带入换行/回车等不可见空白字符,且变量未加引号导致shell解析异常。修改后的脚本如下:
#!/bin/bash while read -r card do echo "$card" zabbix_sender -z 10.160.0.121 -s "$card" -k receive.power1 -o "$rx1" zabbix_sender -z 10.160.0.121 -s "172.16.1.116" -k receive.power1 -o "$rx1" done < list.txt
-r:阻止read解析反斜杠字符,保证读取的IP地址原始性"$card":用双引号包裹变量,避免空白字符被shell拆分,确保zabbix_sender收到完整的IP作为主机名- 替换管道写法为
< list.txt:避免子shell问题,同时提升脚本效率
2. 修正list.txt的换行符格式
如果list.txt是Windows环境编辑的,可能带有CRLF(\r\n)换行符,read会把\r读入变量,导致主机名变成172.16.1.116\r,Zabbix无法匹配。可以用以下命令转换为Unix格式(LF):
dos2unix list.txt
原因说明
echo $card能正常显示是因为echo会自动忽略末尾的换行/回车字符,但zabbix_sender会严格将变量内容作为主机名发送,Zabbix服务器中不存在带特殊字符的主机,因此请求失败-o参数的$rx1正常工作,是因为该变量本身不含空白字符,但为了规范,建议所有变量都用双引号包裹
内容的提问来源于stack exchange,提问作者j4ck1nth3b0x
相关产品推荐
相关产品推荐

