
Мне нужно создать фильтр LDAP с очень длинным условием ИЛИ, и мне интересно, есть ли лучший способ сделать это.
В настоящее время я использую следующую строку запроса:
(|(userid=user1)(userid=user2)(userid=user3)....)
В этой строке запроса может быть до 200 или около того пользователей. Пользователи, о которых идет речь, не входят ни в одну определенную группу LDAP и не имеют никаких других общих атрибутов; они случайным образом распределены по всему каталогу LDAP. Единственный способ идентифицировать интересующих меня пользователей — это использовать их идентификатор пользователя. У меня также нет контроля над сервером LDAP, и я не могу создать группу пользователей (это также не имело бы особого смысла в данном контексте).
Создание этой строки запроса — утомительный процесс, который может привести к ошибкам, и мне интересно, нет ли лучшего способа сделать это.
Дополнительная информация: полный каталог LDAP очень большой, десятки тысяч пользователей. Пользователи, о которых идет речь, были выбраны для прохождения учебного курса, и компьютеры в классе позволят войти в систему только выбранным пользователям. Список пользователей (и, следовательно, мой фильтр) меняется каждые несколько недель.
Базовой реализацией будет openldap на RedHat 7.
решение1
#!/usr/bin/env perl
use 5.14.0;
use warnings;
use Net::LDAP::Util qw(escape_filter_value);
# users as arguments or via standard input
chomp(@ARGV = readline *STDIN) unless @ARGV;
print '(|';
for my $user (@ARGV) {
print '(userid=' . escape_filter_value($user) . ')';
}
say ')';
И потом что-то вроде
$ sudo yum -y install perl-LDAP
... yum flails wildly here ...
$ perl whatyoucalledtheabovecode foo bar zot
(|(userid=foo)(userid=bar)(userid=zot))
$