第 3 章 管理目录条目

您可以使用命令行或 Web 控制台管理目录条目。

3.1. 使用命令行管理目录条目

要使用命令行执行 LDAP 操作,请安装 openldap-clients 软件包。这个软件包安装的工具可让您:
  • 添加新条目
  • 在现有条目中添加新属性
  • 更新现有条目和属性
  • 从条目中删除条目和属性
  • 执行批量操作
安装 openldap-clients 软件包:
# yum install openldap-clients
注意
要执行 LDAP 操作,您需要适当的权限。有关访问控制的详情,请参考 第 18 章 管理访问控制

3.1.1. 为 ldapadd,ldapmodify, 和 ldapdelete 工具提供输入

当您在目录中添加、更新或删除条目或属性时,您可以使用工具的交互模式进入 LDAP 数据交换格式(LDIF)语句或将 LDIF 文件传递给它们。
有关 LDIF 的详情,请参考 第 B.1 节 “关于 LDIF 文件格式”

3.1.1.1. 使用互动模式提供输入

在交互模式中,ldapaddldapmodifyldapdelete 工具会从命令行读取输入。要退出互动模式,请按 Ctrl+D (^D)组合来发送 End Of File (EOF)转义序列。
在交互模式中,当按 Enter 两次或发送 EOF 序列时,实用程序会将语句发送到 LDAP 服务器。
使用互动模式:
  • 在不创建文件的情况下输入 LDIF 语句:

    例 3.1. 使用 ldapmodify 互动模式输入 LDIF 声明

    以下示例以交互模式启动 ldapmodify,删除 telephoneNumber 属性,并使用 cn=manager_name,ou=body,dc=example,dc=com 值添加到 uid=user,ou=body,dc=com 条目。在最后的声明后按 Ctrl+D 退出交互模式。
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    
    dn: uid=user,ou=people,dc=example,dc=com
    changetype: modify
    delete: telephoneNumber
    -
    add: manager
    manager: cn=manager_name,ou=people,dc=example,dc=com
    ^D
  • 要将 LDIF 语句重定向到目录服务器,由其他命令输出:

    例 3.2. 使用带有重定向内容的 ldapmodify 互动模式

    以下示例将 command_that_outputs_LDIF 命令的输出重定向到 ldapmodify。交互模式会在重定向的命令退出后自动退出。
    # command_that_outputs_LDIF | ldapmodify -D "cn=Directory Manager" \
         -W -p 389 -h server.example.com -x

3.1.1.2. 使用 LDIF 文件提供输入

在交互模式中,ldapaddldapmodifyldapdelete 工具从文件中读取 LDIF 语句。使用此模式向目录服务器发送大量 LDIF 语句。

例 3.3. 将带有 LDIF 声明的文件传递给 ldapmodify

  1. 使用 LDIF 语句创建一个文件。例如,使用以下语句创建 ~/example.ldif 文件:
    dn: uid=user,ou=people,dc=example,dc=com
    changetype: modify
    delete: telephoneNumber
    -
    add: manager
    manager: cn=manager_name,ou=people,dc=example,dc=com
    本例删除 telephoneNumber 属性,并将带有 cn=manager_name,ou=body,dc=example,dc=com 值的 manager 属性添加到 uid=user,ou=body,dc=example,dc=com 条目。
  2. 使用 -f file_name 选项将文件传递给 ldapmodify 命令:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x \
         -f ~/example.ldif

3.1.2. 持续操作模式

如果您将多个 LDIF 语句发送到 Directory 服务器,且一个操作失败,该过程将停止。但是,在成功添加、修改或删除错误前处理的条目。
要忽略错误并继续批处理中的其他 LDIF 语句,请将 -c 选项传给 ldapaddldapmodify。例如:
# ldpamodify -c -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

3.1.3. 添加条目

要在目录中添加新条目,请使用 ldapaddldapmodify 工具。请注意,ldapadd 是到 /bin/ldapmodify 的符号链接。因此,ldapadd 执行与 ldapmodify -a 相同的操作。
注意
如果父条目已存在,您只能添加新目录条目。例如,如果 ou=body,dc=example,dc=com 父条目不存在,则无法添加 cn=user ,ou=body,dc=example,dc=com 父条目。

3.1.3.1. 使用 ldapadd添加条目

使用 ldapadd 工具来添加 cn=user,ou=body,dc=example,dc=com 用户条目:
# ldapadd -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
uid: user
givenName: given_name
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
sn: surname
cn: user
注意
运行 ldapadd 会自动执行 changetype: add operation。因此,您不需要在 LDIF 语句中指定 changetype: add
有关命令中使用的参数的详情,请查看 ldapadd(1) man page。

3.1.3.2. 使用 ldapmodify 添加一个条目

使用 ldapmodify 工具来添加 cn=user,ou=body,dc=example,dc=com 用户条目:
# ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
uid: user
givenName: given_name
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
sn: surname
cn: user
注意
-a 选项传给 ldapmodify 命令时,实用程序会自动执行 changetype: add operation。因此,您不需要在 LDIF 语句中指定 changetype: add
有关命令中使用的参数的详情,请查看 ldapmodify(1) man page。

3.1.3.3. 创建根条目

要创建数据库后缀的 root 条目,如 dc=example,dc=com,以 cn=Directory Manager 用户绑定并添加该条目。
DN 对应于数据库的 root 或子跟踪的 DN。
例如,添加 dc=example,dc=com 后缀:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: dc=example,dc=com
changetype: add
objectClass: top
objectClass: domain
dc: example
注意
只有在每个后缀都有一个数据库时,才能添加 root 对象。如果创建一个存储在多个数据库的后缀,则必须使用带有 -n back_end 选项的 ldif2db 工具来设置保存新条目的数据库。详情请查看 第 6.1.2 节 “使用命令行导入”

3.1.4. 更新目录条目

修改目录条目时,请使用 changetype: modify 语句。根据更改操作,您可以从条目中添加、更改或删除属性。
使用 ldapmodify 实用程序将 LDIF 语句发送到目录服务器。例如,在互动模式中:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
有关 ldapmodify 命令中使用的参数的详情,请查看 ldapmodify(1) man page。

3.1.4.1. 在条目中添加属性

若要向条目添加属性,请使用 add 操作。
例如,要将带有 555-1234567 值的 telephoneNumber 属性添加到 uid=user,ou=People,dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
add: telephoneNumber
telephoneNumber: 555-1234567
如果属性是多值,您可以多次指定属性名称,以在单个操作中添加所有值。例如,要将两个 telephoneNumber 属性一次添加到 uid=user,ou=People,dc=example,dc=com
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
add: telephoneNumber
telephoneNumber: 555-1234567
telephoneNumber: 555-7654321

3.1.4.2. 更新属性的值

更新属性值的步骤取决于属性是单值还是多值。

更新单值属性

更新单值属性时,请使用 replace 操作来覆盖现有值。以下命令更新 uid=user,ou=People,dc=example,dc=com 条目的 manager 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
replace: manager
manager: uid=manager_name,ou=People,dc=example,dc=com

更新多值属性的特定值

要更新多值属性的特定值,您必须首先删除您要替换的条目,然后添加新值。以下命令只更新 uid=用户,ou=People,dc=example,dc=com 条目中当前设置为 555-1234567telephoneNumber 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
delete: telephoneNumber
telephoneNumber: 555-1234567
-
add: telephoneNumber
telephoneNumber: 555-9876543

3.1.4.3. 从条目中删除属性

要从条目中删除属性,请使用 delete 操作。

删除属性

例如,要从 uid=user,ou=People,dc=example,dc=com 条目中删除 manager 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
delete: manager
注意
如果属性包含多个值,则此操作会删除所有这些值。

删除多值属性的特定值

如果要从多值属性中删除特定值,请在 LDIF 语句中列出属性及其值。例如,要从 uid=用户,ou=People,dc=example,dc=com 条目中只删除设为 555-1234567telephoneNumber 属性:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
delete: telephoneNumber
telephoneNumber: 555-1234567

3.1.5. 删除条目

删除条目会从目录中删除该条目。
注意
您只能删除没有子条目的条目。例如,如果 uid=user,ou=People,dc=example,dc=com 条目仍然存在,则无法删除 ou=People,dc=example,dc=com 条目。

3.1.5.1. 使用 ldapdelete 删除一个条目

ldapdelete 工具允许您删除一个或多个条目。例如,要删除 uid=user,ou=People,dc=example,dc=com 条目:
# ldapdelete -D "cn=Directory Manager" -W -p 389 -h server.example.com -x "uid=user,ou=People,dc=example,dc=com"
若要删除一个操作中的多个条目,请将其附加到命令中。例如:
# ldapdelete -D "cn=Directory Manager" -W -p 389 -h server.example.com -x \
     "uid=user1,ou=People,dc=example,dc=com" \
     "uid=user2,ou=People,dc=example,dc=com"
有关使用的参数的详情,请查看 ldapdelete(1) man page。

3.1.5.2. 使用 ldapmodify 删除一个条目

要使用 ldapmodify 工具删除条目,请使用 changetype: delete 操作。例如,要删除 uid=user,ou=People,dc=example,dc=com 条目:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: delete

3.1.6. 重命名和移动条目

本节介绍如何重命名或移动条目。
注意
使用 moddn 访问控制列表(ACL)授予权限来移动条目。详情请查看 第 18.9.2.1 节 “目标源和目标 DN”
存在以下重命名操作:
重命名条目
如果您重命名条目,modrdn 操作会更改条目的 Relative Distinguished Name (RDN):
重命名子条目
对于子树条目,modrdn 操作重命名子树以及子条目的 DN 组件:
请注意,对于大型子树,这个过程可能需要大量时间和资源。
将条目移到新父条目
重命名子树的类似操作是将条目从一个子树移到另一个子树。这是 modrdn 操作的扩展类型,同时重命名条目并设置 newSuperior 属性,它将条目从一个父项移到另一个父项:

3.1.6.1. 重命名条目的注意事项

执行重命名操作时请记住以下几点:
  • 您无法重命名 root 后缀。
  • 子树重命名操作对复制的影响最小。复制协议应用于整个数据库,而不是数据库中的子树。因此,子树重命名操作不需要重新配置复制协议。子树重命名操作之后的所有名称都会正常进行复制。
  • 重命名子树可能需要重新配置任何同步协议。同步协议在后缀或子树级别上设置。因此,重命名子树可能会破坏同步。
  • 重命名子树要求手动重新配置子树设置的所有子树级别访问控制指令(ACI),以及为子树的子条目设置的任何条目级别 ACI。
  • 尝试更改子树的组件(如从 ou 移到 dc )可能会失败,并显示模式违反情况。例如,organizationUnit 对象类需要 ou 属性。如果作为重命名子树的一部分删除了该属性,则操作会失败。
  • 如果您移动组,MemberOf 插件会自动更新 memberOf 属性。但是,如果您移动包含组的子树,您必须在 cn=memberof 任务条目中手动创建任务,或使用 fixup-memberof.pl 更新相关的 memberOf 属性。
    有关清理 memberOf 属性引用的详情,请参考 第 8.1.4.8 节 “重新生成 memberOf 值”

3.1.6.2. 重命名用户、组、POSIX 组和 OUs

dsidm 工具可以重命名多种类型的对象:
  • Users:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" user rename current_user_name new_user_name
    请注意,dsidm user rename 命令会自动将 ou=People 放置到您指定的基本 DN 前面。
  • groups:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" group rename current_group_name new_group_name
    请注意,dsidm group rename 命令会自动将 ou=Groups 放置到您指定的基本 DN 前面。
  • POSIX 组:
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" posixgroup rename current_posix_group_name new_posix_group_name
    请注意,dsidm posixgroup rename 命令会在您指定的基本 DN 之前自动放置 ou=Groups
  • 机构单元(OU)
    # dsidm -D "cn=Directory Manager" ldap://server.example.com -b "dc=example,dc=com" organizationalunit rename current_ou_name new_ou_name
    dsidm organizationalunit rename 命令直接在您指定的基本 DN 中执行重命名操作。

3.1.6.3. 使用 LDIF 声明重命名条目时 deleteOldRDN 参数

当您重命名条目时,deleteOldRDN 参数控制是否删除或保留旧的 RDN。
deleteOldRDN: 0
现有 RDN 保留为新条目中的值。生成的条目包含两个 cn 属性:一个具有旧属性,另一个具有新的通用名称(CN)。
例如,以下属性属于从 cn=old_group,dc=example,dc=com 重命名为 cn=new_group,dc=example,dc=com 的组,它设置了 deleteOldRDN: 0。
dn: cn=new_group,ou=Groups,dc=example,dc=com
objectClass: top
objectClass: groupOfUniqueNames
cn: old_group
cn: new_group
deleteOldRDN: 1
目录服务器删除旧条目,并使用新的 RDN 创建新条目。新条目仅包含新条目的 cn 属性。
例如,以下组被重命名为 cn=new_group,dc=example,dc=com,设置了 deleteOldRDN: 1 参数:
dn: cn=new_group,ou=Groups,dc=example,dc=com
objectClass: top
objectClass: groupofuniquenames
cn: new_group

3.1.6.4. 使用 LDIF 声明重命名条目或子树

要重命名条目或子树,请使用 changetype: modrdn 操作,并在 newrdn 属性中设置新的 RDN。
例如,要将 cn=demo1,dc=example,dc=com 条目重命名为 cn=example_user,dc=example,dc=com
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=example_user,cn=ldap_connect,dc=example,dc=com
changetype: modrdn
newrdn: cn=example_user
deleteOldRDN: 1
newSuperior: dc=example,dc=com

3.1.6.5. 使用 LDIF 声明将条目移动到新父条目

要将条目移到新父项中,请使用 changetype: modrdn 操作,并将以下内容设置为属性:
newrdn
设置移动条目的 RDN。您必须设置此条目,即使 RDN 保持不变。
Eopuperior
设置新父条目的 DN。
例如,要将 cn=demo 条目从 ou=Germany,dc=example,dc=com 移到 ou=France,dc=example,dc=com
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=demo,ou=Germany,dc=example,dc=com
changetype: modrdn
newrdn: cn=demo
deleteOldRDN: 1
newSuperior: ou=France,dc=example,dc=com

3.1.7. 使用特殊 Characters

使用命令行时,使用引号括起对命令行解释器(如空格()、星号或反斜杠(\)具有特殊含义的字符。根据命令行解释器,使用单引号或双引号。
例如,要以 cn=Directory Manager 用户进行身份验证,请将用户的 DN 放在引号中:
# ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
另外,如果 DN 在组件中包含逗号,请使用反斜杠转义它。例如,要以 uid=用户,ou=People,dc=example.com Chicago 进行身份验证:
# ldapmodify -a -D "cn=uid=user,ou=People,dc=example.com Chicago\, IL" \
     -W -p 389 -h server.example.com -x

3.1.8. 使用 Binary 属性

某些属性支持二进制值,如 jpegPhoto 属性。当您添加或更新此类属性时,实用程序会从文件中读取属性值。要添加或更新这样的属性,您可以使用 ldapmodify 工具。
例如,要将 jpegPhoto 属性添加到 uid=user,ou=People,dc=example,dc=com 条目,并从 /home/user_name/photo.jpg 文件中读取属性值,请输入:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
add: jpegPhoto
jpegPhoto:< file:///home/user_name/photo.jpg
重要
请注意,:和 &lt ; 之间 没有空格

3.1.9. 更新国际化目录中的条目

要将属性值与英语以外的语言搭配使用,请将属性值与语言标签关联。
当使用 ldapmodify 更新设置了语言标签的属性时,您必须将值和语言标签完全匹配,否则操作将失败。
例如,要修改设置了 lang-fr 语言标签的属性值,请在 modify 操作中包含该标签:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: uid=user,ou=People,dc=example,dc=com
changetype: modify
replace: homePostalAddress;lang-fr
homePostalAddress;lang-fr: 34 rue de Seine