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。
修正步骤
- 修改计费模块里的
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逻辑保持不变 } }
- 重启FreeRADIUS并测试,此时
Tmp-String-0会被正确扩展为User-Request,和目标字符串匹配时条件返回false,就会跳过后续不必要的COA/Disconnect发送逻辑了。
额外优化建议
为了避免类似的字符串格式问题(比如查询结果带空格、换行符),可以在比较前用trim函数清理字符串:
if ("%{trim:%{control:Tmp-String-0}}" != "User-Request") { # ... }
内容的提问来源于stack exchange,提问作者Kiran Cherian
相关产品推荐
相关产品推荐

