我尝试在 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))'