Asterisk AGI调用含多Header的cURL脚本失败排查求助
问题分析与解决方案
你的脚本在命令行正常但AGI调用失败,核心原因通常是Asterisk运行环境与命令行环境差异、AGI协议格式不规范或安全机制限制,以下是针对性解决步骤:
1. 修复AGI协议兼容性问题
Asterisk的AGI要求脚本必须先读取标准输入的AGI变量(即使你不需要),否则会导致通信超时;同时变量输出的特殊字符需要转义,避免解析错误。修改脚本如下:
#!/bin/bash # 必须读取AGI输入流(Asterisk会通过stdin传递AGI参数,不读会导致超时) while read line; do [ -z "$line" ] && break done # 执行curl请求,指定CA证书路径避免SSL验证失败(替换为你的系统CA路径) resp=$(/usr/bin/curl -s --cacert /etc/pki/tls/certs/ca-bundle.crt \ -H "Content-Type: application/json" \ -H "Card: 512912***" \ -H "Exp: 1125" \ -H "user: somebody@gmail.com" \ -H "Username: ***" \ -H "Api_token: ***" \ -X POST https://somewebsite/apiivr/getbalance) # 转义JSON中的特殊字符(引号、反斜杠),符合AGI变量格式要求 escaped_resp=$(echo "$resp" | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e "s/'/\\'/g") # 正确输出AGI变量设置命令 echo "SET VARIABLE resp \"--> $escaped_resp\"" echo "NoOp resp: $resp"
2. 排查环境差异导致的SSL问题
命令行用root运行时,curl会使用root的CA证书配置,但Asterisk通常以asterisk用户运行,可能无法读取系统默认CA证书:
- 若临时测试,可在curl命令后加
-k跳过SSL验证(生产环境禁用) - 永久解决:指定系统CA证书路径(如上述脚本中的
--cacert参数,路径可能因系统不同而变化,常见路径:/etc/ssl/certs/ca-certificates.crt或/etc/pki/tls/certs/ca-bundle.crt)
3. 查看Asterisk日志定位具体错误
通过日志可以直接获取失败原因:
# 实时查看Asterisk完整日志(PBXware的日志路径可能为/opt/pbxware/pw/var/log/asterisk/full) tail -f /opt/pbxware/pw/var/log/asterisk/full | grep -E "AGI|resp_example.sh"
常见错误包括:SSL证书验证失败、curl命令执行权限不足、AGI输出格式错误等。
4. 检查SELinux限制(若系统启用)
即使文件权限设为777,SELinux可能阻止Asterisk执行脚本或发起网络请求:
- 临时关闭SELinux测试:
setenforce 0 - 若测试有效,添加SELinux规则:
# 将脚本标记为Asterisk AGI可执行类型 semanage fcontext -a -t asterisk_agi_exec_t "/opt/pbxware/pw/var/lib/asterisk/agi-bin/resp_example.sh" restorecon -v "/opt/pbxware/pw/var/lib/asterisk/agi-bin/resp_example.sh"
内容的提问来源于stack exchange,提问作者Petar H
相关产品推荐
相关产品推荐

