【问题标题】:use file for filter in Perl Net::LDAP在 Perl Net::LDAP 中使用文件进行过滤
【发布时间】:2019-09-26 11:13:23
【问题描述】:

当我在命令行上手动执行 LDAP 搜索时,我可以这样做,以便过滤器属性可以像这样从文件中脱落:

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

myqueries.txt 包含以下条目:

name1
name2
nameN

现在我正在尝试使用 Net::LDAP 在 Perl 中做同样的事情,但我在文档中找不到类似的选项。 不知道能不能做到?

在最坏的情况下,我知道我可能可以创建一个记录数组(包含查询)并在这些名称上创建一个包含许多 ldapsearch 的循环,它会起作用,但我更喜欢用网络做一些更简单的事情: :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 ) ]
  );

谢谢!

【问题讨论】:

    标签: perl ldap netldap


    【解决方案1】:

    似乎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 ) ]
      );
      ...
    }
    

    您还可以通过在 OR 过滤器中连接属性值来避免 foreach 循环,并且仍然在单个查询中获得相同的结果:

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

    【讨论】:

    • 谢谢,这就是我的想法,将尝试这两种解决方案,看看会发生什么。由于我的输入非常大,我不确定它会接受过滤器,我猜循环解决方案更干净。也会比较速度
    猜你喜欢
    • 2021-11-03
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多