使用 BASH 的 LDAP 搜索过滤器

使用 BASH 的 LDAP 搜索过滤器

我尝试在 bash 脚本中运行以下查询,允许我检查两个不同的对象类以获取从 while 循环传递的已定义属性:

#!/bin/bash

inputfile="$1"
binddn="cn=admin,o=services"
password="BLAH"
IFS=','
while read -r Field1 Field2 Field3 Field4 Field5 Field6 ;
do
    ldapsearch -h "`hostname --fqdn`" -p 389 -x -LLL -D "${binddn}" -w "${password}" "'(&(|(ObjectClass=Group1)(ObjectClass=Group2))(Field1Attribute="${Field1}"))'"
done < "$inputfile"
exit 0

每当我运行该命令时,变量 Field1 都会成功传递,但我会收到错误的搜索过滤器错误:

ldapsearch -h HOSTNAME -p 389 -x -LLL -D cn=admin,o=services -w BLAH ''\''(&(|(ObjectClass=Group1)(ObjectClass=Group2))(Field1Attribute=FIELD1OUTPUT))'\'''
ldapsearch: ldap_search_ext: Bad search filter (87)

我注意到该命令将 (''\') 添加到过滤器的开头和结尾。我手动运行命令减去刻度线和反斜杠,查询成功运行。这是怎么添加进去的?

我还将搜索过滤器作为变量以及命令本身传递,但没有成功。

答案1

如果你这样做:

ldapsearch -h ... "'(&(this)(that="${Field1}"))'"

单引号将成为带引号的字符串的一部分,并且它们将转到ldapsearch.这并不期望他们,给出错误。另外, 的扩展${Field1}是不加引号的,因为第二个双引号结束了引用。 (引号不能嵌套。)

您的其他输出看起来像 Bash 的 xtrace 的输出。它试图告诉您该参数实际上包含一个字面引用,但引用相当难以阅读。

在此:

''\''(&(|(ObjectClass=Group1)(ObjectClass=Group2))(Field1Attribute=FIELD1OUTPUT))'\'''

我们有

''           -- an empty string
\'           -- a literal backslash
'(&(|(...))' -- a quoted string
\'           -- another literal backslash
''           -- another empty string

我怀疑你想要的是

ldapsearch -h ... "(&(this)(that=\"${Field1}\"))"

字符串中的双引号指向ldapsearch, 或

ldapsearch -h ... "(&(this)(that=${Field1}))"

没有他们。

无论如何,没有周围的单引号。我不确定双引号是否应该在那里,我不记得ldapsearch接受什么格式规则。

据我在实践中测试,这在一台机器上运行良好:

$ user=itvirta
$ ldapsearch -xLLL "(&(objectClass=shadowAccount)(uid=$user))" 
$ ldapsearch -xLLL '(&(objectClass=shadowAccount)(uid=itvirta))' 

相关内容