介绍
LDAP是用于管理目录服务和与目录服务交互的协议。 OpenLDAP项目提供了一个符合LDAP的目录服务,可用于存储和提供目录数据的接口。 在本指南中,我们将讨论用于与LDAP目录通信的LDIF文件格式。我们将讨论可用于处理这些文件并根据指定的命令修改LDAP目录信息树的工具。先决条件
在开始本指南之前,您应该可以访问OpenLDAP服务器。你可以学习如何设置OpenLDAP服务器 在这里 。 您应该熟悉与LDAP目录服务时使用的基本术语。 本指南可用于更熟悉这些主题。LDIF格式
LDIF或LDAP数据交换格式是用于表示LDAP数据和命令的文本格式。使用LDAP系统时,您可能使用LDIF格式来指定数据和您希望对LDAP DIT进行的更改。 LDIF意在能够描述LDAP系统中的任何条目,以及必须进行的任何修改。正因为如此,语法非常精确,最初看起来有点复杂。使用LDIF,LDAP更改可以在具有任意名称的文件中简单写入,然后使用一个可用的管理命令馈入LDAP系统。 LDIF使用基本键值系统工作,每行一个语句。键位于行的左侧,后跟冒号(:)和空格。空间对于正确读取行非常重要。然后在右侧分配该值。此格式适用于LDAP的属性重的语法,但也可用于发出命令并提供有关如何解释内容的说明。 通过用单个空格开始额外的行,可以使用多行来为属性提供长的值。 LDAP将在处理条目时加入这些。将条目添加到DIT
在LDIF文件中指定新条目有两种主要方法。您需要的最佳方法取决于您需要协调的其他更改的类型。您选择的方法将指定必须用于将更改应用于LDAP DIT(目录信息树)的工具和参数。列出要添加到DIT的条目
定义要添加到LDAP的新条目的最基本的方法是完全列出条目,完全如使用LDAP工具显示的那样。 这将启动与那里的条目将被创建,后的DN(专有名称)dn:
指标:
dn: ou=newgroup,dc=example,dc=com
在上面的行中,我们引用几个键值对为了构造我们的新条目的DN。当
设置属性值,则必须使用冒号和空间。 当
引用属性/值,等号应改为使用。 在用于向DIT添加条目的最简单的LDIF格式中,条目的其余部分使用DN定义下面的该格式简单地写出。必须设置必要的objectClass声明和属性以构造有效的条目。例如,要创建一个组织单位来包含组织员工的条目,我们可以使用:
dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People
您可以在单个文件中添加多个条目。每个条目必须至少由一个完全空白的行分隔:
dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=othergroup,dc=example,dc=com
objectClass: organizationalUnit
ou: othergroup
正如您所看到的,这个LDIF格式几乎完全镜像查询LDAP树中具有此信息的条目时所看到的格式。你几乎可以写出你想要的条目包含逐字。
使用“Changetype:Add”创建新条目
如果您在同一个LDIF文件中进行其他修改,我们将查看的第二种格式很好。 OpenLDAP提供了可以处理添加和修改的工具,因此如果我们修改同一文件中的其他条目,我们可以将新条目标记为添加,以便正确处理它们。 这看起来很像上面的方法,但我们添加changetype: add
正下方的DN规范。 例如,我们可以添加一个约翰史密斯条目已包含一个DIT
ou=People,dc=example,dc=com
使用这样的LDIF结构:
dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
description: John Smith from Accounting. John is the project
manager of the building project, so contact him with any que
stions.
cn: John Smith
sn: Smith
uid: jsmith1
这基本上是我们迄今为止用于描述条目的格式,除了DN规范之外的一个附加行。在这里,我们告诉LDAP我们所做的改变是一个条目创建。由于我们使用
changetype
选项,此内容可以通过处理
ldapmodify
工具没有问题,使我们能够置于同一LDIF文件其他类型的修改。 该
changetype
选项必须在DN规范后,立即来了。 上述另外需要注意的是采用了多线值的
description
属性。由于后面的行以空格开头,它们将被删除的空间连接。我们在示例中的第一个连续行包含一个额外的空间,但这是句子本身的一部分,分隔词“项目”和“经理”。 与最后一节一样,同一文件中的每个附加条目由空行分隔。注释可以通过启动与该行中使用
#
字符。注释必须在自己的行上存在。例如,如果我们想在这个相同的LDIF文件中添加Sally,我们可以将这两个条目分开:
# Add John Smith to the organization
dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
description: John Smith from Accounting. John is the project
manager of the building project, so contact him with any qu
estions.
cn: John Smith
sn: Smith
uid: jsmith1
# Add Sally Brown to the organization
dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: add
objectClass: inetOrgPerson
description: Sally Brown from engineering. Sally is responsibl
e for designing the blue prints and testing the structural int
egrity of the design.
cn: Sally Brown
sn: Brown
uid: sbrown20
处理条目添加
现在我们知道如何构造LDIF文件以添加新条目,我们需要使用LDAP工具实际处理这些文件以将其添加到DIT。您使用的工具和/或参数将取决于您在上面选择的形式。 如果您使用的是简单的输入格式(没有changetype
设置),可以使用
ldapadd
命令或
ldapmodify
命令与
-a
标志,它指定一个条目的补充。您需要使用SASL方法对LDAP实例进行身份验证(这不在本指南的范围之内),或者绑定到DIT中的管理帐户并提供所需的密码。 举例来说,如果我们从一个名为简单的入口段存储在我们的项目
newgroups.ldif
,命令我们需要处理的文件,并添加新条目会是这个样子:
ldapadd -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newgroups.ldif
你还可以使用
ldapmodify -a
为相同的结果组合:
ldapmodify -a -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newgroups.ldif
如果您使用的是
第二种格式,用
changetype
声明,你将要使用
ldapmodify
没有命令
-a
标志。 由于此命令和格式适用于大多数其他修改,因此可能更容易用于大多数更改。 如果我们存储在文件名为中的两个新用户增加
newusers.ldif
,我们可以通过键入像这样把它添加到我们现有的DIT:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f newusers.ldif
这将允许您随意添加条目到您的DIT。您可以轻松地将多个条目存储在单个LDIF文件中,并在单个命令中填充您的DIT。
从DIT中删除条目
我们有我们的第一次看到changetype
在最后一节的选项。此选项提供了指定要进行的高级修改类型的方法。对于条目删除,此选项的值为“delete”。 条目删除实际上是您可以执行的最直接的更改,因为所需的唯一信息是DN。 举例来说,如果我们想去掉
ou=othergroup
从我们的DIT项,我们的LDIF文件只需要包含此:
dn: ou=othergroup,dc=example,dc=com
changetype: delete
要处理的变化,您可以使用与所用的确切格式
ldapmodify
以上。 如果我们调用的删除请求文件
rmothergroup.ldif
,我们将适用这样的:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f rmothergroup.ldif
这将删除
ou=othergroup
立即从系统入口。
修改条目的属性
修改条目的属性是一个非常普遍的变化,使与通过指定成为可能changetype: modify
的条目的DN之后。您可以对属性进行的修改类型大多反映您可以对条目本身进行的修改。因此,所请求的属性更改类型的详细信息随后使用附加指令指定。
向条目添加属性
例如,你可以通过添加一个属性add:
后命令
changetype: modify
。这应该指定您希望添加的属性。然后,您可以像正常一样设置属性的值。所以基本格式是:
dn: entry_to_add_attribute
changetype: modify
add: attribute_type
attribute_type: value_to_set
例如,要向我们的帐户添加一些电子邮件地址,我们可以有一个LDIF文件,如下所示:
dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modify
add: mail
mail: sbrown@example.com
dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: mail
mail: jsmith1@example.com
mail: johnsmith@example.com
从第二个条目可以看出,您可以同时指定多个添加。该
mail
属性允许多个值,所以这是允许的。 您可以处理此
ldapmodify
正常。 如果变化是在文件
sbrownaddmail.ldif
,你可以输入:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f sbrownaddmail.ldif
替换条目中属性的值
另一个常见的更改是修改属性的现有值。我们可以通过这样做replace:
以下选项
changetype: modify
。 此操作在几乎相同的方式为
add:
命令,但默认,将删除条目的属性的每一个现有的发生和与事后定义的值来替换它。 举例来说,如果我们注意到,我们最后
add:
命令有一个不正确的电子邮件,我们可以先修改它
replace
像这样的命令:
dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modify
replace: mail
mail: sbrown2@example.com
请记住,这将取代
每个实例
mail
中的条目。 这是可以被定义不是每个条目(如一次多值属性重要
mail
)。 如果你希望只更换一个属性的单一事件,您应该使用属性
delete:
组合选项(如下所述)的属性
add:
选项(如上所述)。 如果这种变化是存储在一个名为
sbrownchangemail.ldif
,我们可以通过打字取代莎莉的电子邮件:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f sbrownchangemail.ldif
从条目中删除属性
如果你想从一个条目中删除一个属性,可以使用delete:
命令。您将指定要删除的属性作为选项的值。如果要删除属性的特定实例,可以在下一行上指定特定键值属性的出现。否则,将删除条目中该属性的每次出现。 例如,这将删除John Smith的条目中的每个描述属性:
dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: description
但是,这将只删除指定的电子邮件:
dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: mail
mail: jsmith1@example.com
由于我们早些时候给了John两个电子邮件地址,因此该请求应保留其他电子邮件地址不变。 如果这些变化是在一个名为文件
jsmithrmdesc.ldif
和
jsmithrmextramail.ldif
,我们可以通过键入应用它们:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmdesc.ldif
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f jsmithrmextramail.ldif
指定多个属性更改
这是讨论同时指定多个属性更改的好时机。对于LDIF文件中的一个条目,您可以通过它们与只与一个填充分隔行指定多个属性的变化-
字符。在分隔符后,必须指定属性更改类型,并且必须给出必需的属性。 例如,我们可以删除John的剩余电子邮件属性,将其姓名更改为“Johnny Smith”,并通过创建具有以下内容的文件来添加他的位置:
dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
delete: mail
-
replace: cn
cn: Johnny Smith
-
add: l
l: New York
以应用所有这些变化的一个命令,我们会使用相同
ldapmodify
我们已经使用了一直以来的格式:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f multichange.ldif
重命名和移动条目
该changetype: modrdn
选项,则可以重命名或移动现有的条目。 指定后
dn:
要定位,设置
changetype: modrdn
选项。
重命名条目
让我们说,当我们最初输入系统时,我们输入了Sally的用户名。因为这是在条目的DN使用时,它不能简单地与取代changetype: modify
和
replace:
选项,因为条目的RDN将是无效的。 如果她的真名是
sbrown200
,我们可以修改条目的DN,创造沿途的任何必要的属性,像这样的LDIF文件:
dn: uid=sbrown20,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown200
deleteoldrdn: 0
我们可以使用此命令应用此更改:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f fixsallydn.ldif
这将使完整的条目看起来像这样:
dn: uid=sbrown200,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
description: Sally Brown from engineering. Sally is responsibl
e for designing the blue prints and testing the structural int
egrity of the design.
cn: Sally Brown
sn: Brown
uid: sbrown20
uid: sbrown200
mail: sbrown2@example.com
您可以看到,我们的DN已调整为使用新的属性/值对。属性已添加到条目中以使其成为可能。 你可能在上面的例子中注意到了两件事。首先,我们设置称为选项
deleteoldrdn
为“0”。 其次,所产生的条目同时
uid: sbrown20
和
uid: sbrown200
。 该
deleteoldrdn
选项必须改变输入的DN时设置。 设置
deleteoldrdn
为“0”会导致LDAP保持在DN一起使用的条目中的新属性的旧属性。 有时这是你想要的,但是通常你会想要在DN更改后完全从条目中删除旧属性。 您可以通过设置做
deleteoldrdn
为“1”代替。 让我们假设我们又犯了一个错误和莎莉的实际用户名是
sbrown2
。 我们可以设置
deleteoldrdn
为“1”以除去
sbrown200
当前在DN从重命名后的条目中使用的实例。 我们将继续前进,包括附加
changetype: modify
和
delete:
对来摆脱其他杂散用户名的
sbrown20
,因为我们一直围绕第一重命名时:
dn: uid=sbrown200,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown2
deleteoldrdn: 1
dn: uid=sbrown2,ou=People,dc=example,dc=com
changetype: modify
delete: uid
uid: sbrown20
应用这样的文件:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f fix2sallydn.ldif
这种组合不会与变化(添加新的用户名
sbrown200
将被删除),以及所述第二条目修改将删除的用户名(原值
sbrown20
)。
移动条目
如果你需要移动进入到一个新的位置,额外设置changetype: modrdn
是
newsuperior:
选项。使用此选项时,您可以在DIT上指定一个新位置来移动条目。这将在更改期间将条目放在指定的父DN下。 举例来说,如果我们想移动莎莉下
ou=superusers
进入,我们可以添加这个条目,然后键入以下命令动她吧:
dn: ou=superusers,dc=example,dc=com
changetype: add
objectClass: organizationalUnit
ou: superusers
dn: uid=sbrown2,ou=People,dc=example,dc=com
changetype: modrdn
newrdn: uid=sbrown2
deleteoldrdn: 0
newsuperior: ou=superusers,dc=example,dc=com
假设这被存储在一个文件名为
mksuperuser.ldif
,我们可以应用这样的变化:
ldapmodify -x -D "cn=admin,dc=example,dc=com" -w password -H ldap:// -f mksuperuser.ldif
这导致移动,从不复制。 在这种情况下,我们并不希望真正改变条目的RDN,所以我们设置
newrdn:
值相同的值,它目前拥有。 我们可以很容易地重命名在移动过程中,虽然如果我们这样想。 在这种情况下,
newsuperior:
设置为第二变化,实际上影响条目的状态的唯一路线。
As Aside:向条目添加二进制数据
此部分与上述信息分开,因为它可以适合创建条目或定义其他属性的部分。 LDAP能够存储某些属性的二进制数据。例如,inetOrgPerson
类允许称为属性
jpegPhoto
,它可以被用来存储一个人的照片,或用户图标。 这种对象类可使用的二进制数据的另一个属性是
audio
属性。 要将此类型的数据添加到LDAP条目,必须使用特殊格式。当指定紧接冒号之后的属性时,使用小于字符(<)和空格。然后,包括相关文件的路径。 举例来说,如果你有一个名为
john.jpg
中
/tmp
目录,您可以将文件添加到约翰与LDIF文件看起来像这样的条目:
dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: jpegPhoto
jpegPhoto:< filehttps://www.youcl.com/uploadsjpg
密切注意冒号的位置,小于字符和空格。如果您的文件位于硬盘上的
file://
前缀都可以使用。如果使用绝对路径,路径将添加一个斜杠以指示根目录。 这将与音频文件的工作方式相同:
dn: uid=jsmith1,ou=People,dc=example,dc=com
changetype: modify
add: audio
audio:< file:///tmp/hellojohn.mp3
处理LDIF文件后,实际的文件将在LDAP目录服务中编码。这一点很重要,因为添加大量这样的文件将对您的服务的大小和性能产生影响。 当你需要使用检索编码数据
ldapsearch
工具,你将需要添加
-t
标志,这将使该文件被写入到
/tmp
目录。生成的文件名将在结果中指示。 例如,我们可以使用此命令将二进制数据写入临时文件:
ldapsearch -LLL -x -H ldap:// -t -b "dc=example,dc=com" "uid=jsmith1"
搜索结果将如下所示:
ldapsearch输出
dn: uid=jsmith1,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
sn: Smith
uid: jsmith1
cn: Johnny Smith
l: New York
audio:< file:///tmp/ldapsearch-audio-n5GRF6
如果我们去
/tmp
目录下,我们可以找到该文件。它可以根据需要重命名,并且应该是在它进入目录之前的确切状态。 在重复执行此操作时要小心,因为每次执行搜索时都会写出一个新文件。你可以很容易地填充一个磁盘,而不意识到,如果你不注意。