如果找到记录,请使用LDAP搜索返回1

时间:2014-09-08 21:14:36

标签: bash ldap ldap-query return-code

再次问好Stackoverflow,

是否有方法让ldapsearch返回" 1"如果找到单个记录,如果没有找到记录则为0;如果在ldap中找到多个记录,则为2(或更大)。我希望能够测试记录,如果返回1,则采取一些预定义的操作。我知道我可以设置$ something = 0然后执行ldapsearch>> $ something然后测试$ something!= 0但这不能有效利用内存或处理时间,并可能导致意外的"有趣的"在我的脚本中。这还需要对$ something执行额外的测试,这将为批处理作业增加更多时间。

ldapsearch -LLL -h ds389.some.org -p 389 -D" uid = someAdmin,o = some.org" -w SOMEpassWord -b" ou = People,o = some.org" -s sub'(&(RMailAliases = zzz)(!(RMid = d *)))'

2 个答案:

答案 0 :(得分:3)

echo `ldapsearch -LLL -h ds389.some.org -p 389 -D "uid=someAdmin,o=some.org" -w SOMEpassWord -b "ou=People,o=some.org" -s sub '(&(RMailAliases=zzz)(!(RMid=d*)))' dn | grep dn: | wc -l`应该做你想做的事。

答案 1 :(得分:0)

令人震惊的是,ldapsearch(自2.4.44起)在不匹配事件上不会返回非零结果。在手册页中:

  

诊断      如果没有错误发生,则退出状态为零。错误会导致退出状态为非零,并且诊断消息会写入标准错误。

鉴于该产品的年龄,这种情况不太可能改变。

@heiglandreas提供了一个合理的解决方案,但这可能会更好:

ldapsearch -LLL <ldap-connection-options <ldap-search-query> dn |
grep -q ^dn:

无论如何,dn属性都是ldapsearch的输出,因此指定它可以使其输出最小化,而-LLL选项则抑制ldapsearch的多余输出。如果找不到匹配项,则POSIX grep的-q选项可确保整个管道以非零值退出。

如果您需要将结果作为文本字符串,只需在上述步骤之后执行echo $?。或者,您可以将grep替换为grep -c ^dn:,如果找到,将输出1,如果找不到,则输出0