调用短信API网关 失败排查分析:

1、配置

配置 通过 脚本 调用短信API网关发送告警:

zabbix_get 和脚本结果不同_zabbix_get 和脚本结果不同

2、问题发现与分析

通过脚本调用 短信API网关 发送告警时,发现 zabbix 推送了 消息动作

zabbix_get 和脚本结果不同_API_02


也调用了 服务端发送短信告警的sendsms.sh脚本:

#!/bin/bash

LOGFILE="/var/log/sendsms.log"

#脚本日志文件

:>“zabbix_get 和脚本结果不同_zabbix_get 和脚本结果不同_03LOGFILE”

exec 2>&1

mobile=$1 #手机号

content="KaTeX parse error: Expected 'EOF', got '#' at position 5: 2" #̲短信内容 XXD="/usr/…(echo “$content” | KaTeX parse error: Can't use function '\(' in math mode at position 20: …} -ps | sed 's/\̲(̲..\)/%\1/g' | t…(echo “$content” |tr -d “^M” | tr “\n” “|” | KaTeX parse error: Can't use function '\(' in math mode at position 24: …plain | sed 's/\̲(̲..\)/%\1/g'|tr …MESSAGE_ENCODE" >>/home/gzpaas/MESSAGE_ENCODE.log

#curl -s -d “mobile=KaTeX parse error: Expected 'EOF', got '&' at position 9: {mobile}&̲content={MESSAGE_ENCODE}” http://135.10.XX.XX:61616/?type=mt_from_paas1

#配置提交短信接口发送;http://135.10…XX.XX:61616/ 为短信接口地址

#curl -s -X POST http://135.10.160.32:8080/sendsms/tel/zabbix_get 和脚本结果不同_API_04{MESSAGE_ENCODE}

curl -s -X POST http://135.10.160.32:8080/springboot_maven-1.0-SNAPSHOT/sendsms/tel/zabbix_get 和脚本结果不同_API_04{MESSAGE_ENCODE} ##部署在tomcat里面的api接口

echo “diaole!!” >> /home/gzpaas/MESSAGE_ENCODE.log

#./alertscripts/sendsms.sh 1880000000 “发送报警测试”

#脚本执行第一个参数为手机号;第二个参数为短信内容。

#脚本执行后,到日志文件 /var/log/sendsms.log 里查看返回值,如果大于0代表发送成功,小于0发送失败但是,发现没有成功调用 短信发送网关API,根据以往经验和直接,把 {ALERT.MESSAGE} 里面内容改成一句中文后发现调通了api接口,后来又仔细手动执行 sendsms.sh 调试后,发现

是因为zabbix内置参数 {ALERT.MESSAGE} 里面 存在windos下的回车符(CR,即是 “\r”),在Linux下一般显示为 “^M” ,而通过 sendsms.sh 删除该特殊字符的时候没有删除成功,原因是在Linux下 愚蠢地 通过键盘上输入了 “^” 和 “M” 来表示回车( “\r”) 或者从其他地方复制到Linux时,该符号并没有转换成真正的 回车符,导致 输入的字符并没有被脚本识别为回车( “\r”),所以就脚本没有删除成功,导致调用接口时候报404 错误:

zabbix_get 和脚本结果不同_回车符_06


zabbix_get 和脚本结果不同_zabbix_get 和脚本结果不同_07


从而导致tomcat并没有收到接口调用的请求日志,太坑了!! 此时,也可以看出 curl请求的urlcode地址中如果有回车符号,是有问题的,如果文本中没有该回车符,无论如何读可以调通api接口的。

3、解决
由于本人有关注很多关于IT方面的微信公众号并保持阅读习惯,之前印象中有阅读过关于Linux下特殊字符处理方面的文章,因此在微信公众号和百度中搜索 “回车” 、“Carriage” 等关键字发现了几篇文章后,阅读后涨了很多知识,得到了很重的提示:
https://mp.weixin.qq.com/s/mJsztHS_1ZRomwsdkUqQlA https://mp.weixin.qq.com/s/uiCcnjS2Kej-MWnhiM7kCA 根据上面两篇文章的提示:
即,在Linux下必须 按下 Ctrl+V 和 Ctrl+M 来表示 ^M (即 回车符 “\r”)
zabbix_get 和脚本结果不同_运维_08

或者 在 脚本中输入 “\r” 来表示回车符,修改脚本后,zabbix触发告警,并成功调用短信网关发送短信如下:

zabbix_get 和脚本结果不同_回车符_09

太坑了, 我们在Linux下处理 windos下的文本文件 及 特殊字符时,真的要很细心,不然被坑十天半月都搞不定一个问题!