![使用 ldapsearch 列出组成员](https://linux22.com/image/511047/%E4%BD%BF%E7%94%A8%20ldapsearch%20%E5%88%97%E5%87%BA%E7%BB%84%E6%88%90%E5%91%98.png)
我们的公司 LDAP 目录位于 Snow Leopard Server Open Directory 设置中。我正在尝试使用该ldapsearch
工具导出 .ldif 文件以导入其他外部 LDAP 服务器用于在外部进行身份验证;基本上尝试在内部和外部使用相同的凭据。
我已经开始ldapsearch
工作,并且获得了“用户”OU 中所有内容的内容和属性,甚至过滤到仅我需要的属性:
ldapsearch -xLLL -H ldap://server.domain.net /
-b "cn=users,dc=server,dc=domain,dc=net" objectClass /
uid uidNumber cn userPassword > directorycontents.ldif
这给了我一个可以导入到我的远程 OpenLDAP 服务器的用户和属性列表。
dn: uid=username1,cn=users,dc=server,dc=domain,dc=net
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: organizationalPerson
uidNumber: 1000
uid: username1
userPassword:: (hashedpassword)
cn: username1
但是,当我在 OD“组”而不是“容器”上尝试相同的查询时,结果如下:
dn: cn=groupname,cn=groups,dc=server,dc=domain,dc=net
objectClass: posixGroup
objectClass: apple-group
objectClass: extensibleObject
objectClass: top
gidNumber: 1032
cn: groupname
memberUid: username1
memberUid: username2
memberUid: username3
我真正想要的是,根据组成员身份筛选出来自上例的用户列表,但看起来成员身份是从组端设置的,而不是从用户帐户端设置的。一定有办法筛选这些,只导出我需要的内容,对吧?
答案1
我使用 LDAP,但不是该特定品牌的服务器。
我首先要尝试的是对用户进行搜索,提取他们的所有属性,而不是像您的示例那样进行限制。
ldapsearch -xLLL -H ldap://server.domain.net \
-b "cn=users,dc=server,dc=domain,dc=net" uid=username1 \* +
通常,用户会有一个“memberOf”属性,其中列出了用户所在组的组名或组 DN,并与组中的信息保持同步。如果有这个属性,那么这是实现您想要的功能的最简单方法。
将*
抓取所有用户属性(默认行为)并且+
将抓取所有操作属性(特殊属性)。
答案2
ldapsearch -x \
-b "cn=<your group name>,ou=group,dc=<your org>,dc=com" \
-H ldaps://<ldap server>:<port>
效果很好。
答案3
您是否打算通过将用户对象放置在不同的容器中来表示组?例如:
dn: uid=username1,cn=users,cn=accounting,dc=server,dc=domain,dc=net
...
dn: uid=username2,cn=users,cn=engineering,dc=server,dc=domain,dc=net
...
如果是这样,我估计你必须编写一个脚本来处理 LDIF。试试这个出色的Python LDAP模块。
不过,我怀疑你为什么要这么做。这会让属于多个组的用户变得很混乱,而且违反了 Open Directory 的惯例。你不能只将所有用户和组对象复制到 OpenLDAP 服务器,然后根据组成员身份而不是用户对象所在的容器进行查询吗?