FreeRadius 配置 (radiusd.conf) - 正则表达式问题 unlang

FreeRadius Configuration (radiusd.conf) - Regex-Problem unlang

我目前在我的 Radius 配置中遇到问题,想向您寻求帮助。

我正在使用 FreeRadius-Version 3.0.23

radiusd.confauthorize 部分中,我正在尝试创建以下 unlang 表达式。

我有以下格式的用户:

super1
super2
...
user1
user2

NAS 标识符:

SUP-A
SUP-B
SUP-C
SUP-D

我想使用正则表达式从 NAS 标识符中提取一些内容并附加到用户。

=> super1-A
=> super2-D

但是,它不适用于以下表达式,因为提取的值在第二个 IF 语句中不再可用。

if ( NAS-Identifier =~ /^SUP\-([ABCD])/ ) {

=> The extracted value is only available at this point
=> Or is it possible to define a local variable with the value?

    if ( "%{User-Name}" !~ /^super\d+/ )
            update request {                                                                                                         
                User-Name := "%{User-Name}-%{1}"   (However, I need the value here)                                                                                                                                                                                     
            }                                                                                                                        
        }
    }

这是我的解决方法:

if ( "%{User-Name}" !~ /^super\d+/ && NAS-Identifier =~ /^SUP\-([ABCD])/ ) {
            update request {                                                                                                         
                User-Name := "%{User-Name}-%{1}"                                                                                                                                                                                        
            }                                                                                                                        
        }

非常感谢您的帮助,因为我在 FreeRadius 文档中找不到任何内容。

提前致谢。

根据 FreeRadius documentation:

Every time a regular expression is evaluated, whether it matches or not, the capture group values will be cleared.

因此,对于您的情况,您可以颠倒条件的顺序:

if ( "%{User-Name}" !~ /^super\d+/ ) {
  if ( NAS-Identifier =~ /^SUP-([ABCD])/ ) {
    update request {                                                                                                         
      User-Name := "%{User-Name}-%{1}" 
    }                                                                                                                        
  }
}

注意 - 字符在字符 类 之外使用时不是任何特殊的正则表达式元字符,这里不需要转义它。