我正在搜索一个 LDAP 目录,该目录的结果数量远远超过 slapd.conf 当前设置的大小限制 500,无论出于何种目的和意图,该限制都无法更改)
我的想法是继续运行 ldapsearch,但每次从不同的偏移量(501、1001 等)开始,直到获得所有结果。
我已经看到了ldapsearch 的手册页,并且看起来这是使用 -E 选项为您处理的:
-E [!]<ext>[=<extparam>] search extensions (! indicates criticality)
[!]domainScope (domain scope)
[!]mv=<filter> (matched values filter)
[!]pr=<size>[/prompt|noprompt] (paged results/prompt)
[!]subentries[=true|false] (subentries)
[!]sync=ro[/<cookie>] (LDAP Sync refreshOnly)
rp[/<cookie>][/<slimit>] (LDAP Sync refreshAndPersist)
所以我尝试了:
ldapsearch -h $HOST -p $PORT -x -L -b "$BASE" '*' '+' -E pr=$SIZE
但是,当结果(例如,即使是大小为 50 的分页结果)达到 500 时,我会收到与未分页结果相同的错误:
Size limit exceeded (4)
我在手册页中看到 virtuallistview 还有另一个选项,但无法找到它的示例,而且我也不认为我的 ldapsearch 版本有这个选项。
这里的目标是使用 ldapsearch 和 -L 选项创建备份,以创建适合恢复数据库的 ldif 文件。
一些谷歌搜索显示了与我遇到的相同问题,但没有一个有适用的解决方案。
答案1
目录服务器管理员可以自由地限制搜索请求响应中可以返回的条目数。LDAP 客户端可以请求大小限制,但客户端请求的限制不能覆盖服务器施加的限制。分页工作正常:分页只是发送多个搜索响应,每个响应的大小都是客户端请求的大小,但仍不能超过服务器施加的大小限制。虚拟列表视图类似于简单分页,不同之处在于 LDAP 客户端可以在任何地方启动和恢复,而在简单分页结果中,LDAP 客户端必须按顺序读取结果。
答案2
ldapsearch -LLL -x -h $LDAPHOST -b"dc=whatever" -D${LDAPUSER} -w"${LDAPPASW}" objectclass=* -E pr=2147483647/noprompt
重要的部分在最后:-E pr=2147483647/noprompt
。我今天实现了这个,所以我知道它有效,至少在 Active Directory 的 LDAP 后端上有效。对我来说,这能够绕过服务器限制。
从您的示例来看,您可能缺少 /noprompt 或 /prompt。区别在于,使用 /prompt 时,它会在每个页面之间停止。
我不确定数字 2147483647 为什么有效,但它确实有效。
答案3
ApacheDS 可以执行您正在寻找的分页搜索。至少针对 Active Directory。