использовать файл для фильтрации в Perl Net :: LDAP - PullRequest
0 голосов
/ 26 сентября 2019

когда я выполняю поиск LDAP вручную в командной строке, я могу сделать это так, чтобы атрибут фильтра мог оторваться от файла, подобного этому:

ldapsearch -v -h <host> -D "<DN>" -b "OU=myou,DC=mydc" -f myqueries.txt "(cn=%s)"

myqueries.txt содержит записи, такие как:

name1
name2
nameN

, сейчас я пытаюсь сделать то же самое в Perl, используя Net :: LDAP , и я не смог найти никакой подобной опции в документации,Знаете ли вы, если он может это сделать?

в худшем случае, я знаю, что я, вероятно, могу создать массив записей (содержащий запросы) и сделать цикл со многими ldapsearches по этим именам, это будет работать,но я бы предпочел сделать что-нибудь проще с атрибутом net :: ldap, если это возможно (меньше кода)

например

$data = $ldap->search(
     base   => $dn,
     scope  => 'one',
     pagesize  => '999',
     filter => '(cn=%s)',
     file => 'myqueries.txt',                # this option does not exist
     attrs  => [ qw( displayName cn ) ]
  );

спасибо!

1 Ответ

0 голосов
/ 26 сентября 2019

Кажется, что опция ldapsearch -f не реализована в Perl Net :: LDAP, но вы все равно можете сделать точный эквивалент: выполнить операцию поиска для каждой строки, считанной из входного файла:

open $handle, '<', $filepath;
chomp(@lines = <$handle>);
close $handle;

foreach $cn (@lines) {
  $data = $ldap->search(
     base   => $dn,
     scope  => 'one',
     pagesize  => '999',
     filter => "(cn=$cn)",
     attrs  => [ qw( displayName cn ) ]
  );
  ...
}

Вы также можете избежать цикла foreach и получить те же результаты в одном запросе, объединив значения атрибутов в фильтре OR:

$filter = '(|(cn=' . join(')(cn=', @lines) . '))';
...