You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:05:37