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

FreeRADIUS中MySQL返回字符串匹配失败问题求助

问题分析与解决方案

从你的调试日志里一眼就能定位到问题核心——你获取的Tmp-String-0值多了一个多余的右大括号!

看这段关键日志输出:

expand: %{sql:SELECT acctterminatecause AS Terminate FROM radacct WHERE radacct.username='%{User-Name}' AND radacct.acctsessionid='%{Acct-Session-Id}'}} -> User-Request}

注意到结果是User-Request}而不是预期的User-Request,这是因为你在定义Tmp-String-0时,SQL语句的闭合部分多写了一个右大括号:

Tmp-String-0 := "%{sql:SELECT acctterminatecause AS Terminate FROM radacct WHERE radacct.username='%{User-Name}' AND radacct.acctsessionid='%{Acct-Session-Id}'}}"

最后面的}}应该改成},多余的那个右大括号被当成了SQL查询结果的一部分,导致字符串比较时"User-Request}" != "User-Request"永远为true。

修正步骤

  1. 修改计费模块里的Tmp-String-0定义,去掉多余的右大括号:
update control {
    ....
    Tmp-String-0 := "%{sql:SELECT acctterminatecause AS Terminate FROM radacct WHERE radacct.username='%{User-Name}' AND radacct.acctsessionid='%{Acct-Session-Id}'}"
    if ("%{control:Tmp-String-0}" != "User-Request") {
        # 原有内部COA/Disconnect逻辑保持不变
    }
}
  1. 重启FreeRADIUS并测试,此时Tmp-String-0会被正确扩展为User-Request,和目标字符串匹配时条件返回false,就会跳过后续不必要的COA/Disconnect发送逻辑了。

额外优化建议

为了避免类似的字符串格式问题(比如查询结果带空格、换行符),可以在比较前用trim函数清理字符串:

if ("%{trim:%{control:Tmp-String-0}}" != "User-Request") {
    # ...
}

内容的提问来源于stack exchange,提问作者Kiran Cherian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:22:14