В настоящее время я столкнулся с проблемой в моей конфигурации Radius и хотел бы попросить вас о помощи.
Я использую FreeRadius-Version 3.0.23
В разделе authorize
в radiusd.conf
я пытаюсь создать следующее выражение 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:
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}"
}
}
}
Обратите внимание, что символ -
не является каким-либо специальным метасимволом регулярного выражения при использовании вне классов символов, здесь нет необходимости экранировать его.
if
s?if ( "%{User-Name}" !~ /^super\\d+/ ) { if ( NAS-Identifier =~ /^SUP\\-([ABCD])/ ) ...