对 LDIF 文件进行查错
Novell 导入转换导出实用程序可方便地将 LDIF 文件导入 eDirectoryTM 或从 eDirectoryTM 中导出 LDIF 文件。有关详细信息,请参见Novell 导入/转换/导出实用程序。
要正确进行 LDIF 导入,必须使用 Novell 导入转换导出实用程序可以读取和处理的 LDIF 文件。本小节将介绍 LDIF 文件的格式和语法,并提供正确的 LDIF 文件示例。
了解 LDIF
LDIF 是一种普遍使用的文件格式,用来描述目录信息或可对目录执行的修改操作。LDIF 完全独立于在所有特定目录中使用的储存格式,LDIF 通常用于从 LDAP 服务器导出目录信息或将数据导入 LDAP 服务器。
LDIF 一般很容易生成。因此,可以借助于一些工具(如 awk 或 perl)将专有格式的数据移入 LDAP 目录。也可以编写脚本来生成 LDIF 格式的测试数据。
LDIF 文件格式
Novell 导入转换导出导入需要 LDIF 1 格式的文件。以下是 LDIF 1 文件的基本规则:
-
- 第一个非注释行必须是版本号:1.
- 版本号后面跟有一个或多个记录。
- 每个记录由多个字段组成,一行一个字段。
- 各行使用换行符或回车符/换行符对分隔。
- 各记录由一个或多个空行分隔。
- 存在两种不同类型的 LDIF 记录:内容记录和更改记录。对 LDIF 文件可以包含的记录数目没有限制,但它们必须属于同一类型。在同一个 LDIF 文件中不能既有内容记录又有更改记录。
- 以井字符 (#) 开头的行是注释行,在处理 LDIF 文件时将被忽略。
LDIF 内容记录
LDIF 内容记录代表整个项的内容。以下是 LDIF 文件示例,共包含四个内容记录:
1 version: 1
2 dn: c=US
3 objectClass: top
4 objectClass: country
5
6 dn: l=San Francisco, c=US
7 objectClass: top
8 objectClass: locality
9 st: San Francisco
10
11 dn: ou=Artists, l=San Francisco, c=US
12 objectClass: top
13 objectClass: organizationalUnit
14 telephoneNumber: +1 415 555 0000
15
16 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
17 sn: Michaels
18 givenname: Peter
19 objectClass: top
20 objectClass: person
21 objectClass: organizationalPerson
22 objectClass: iNetOrgPerson
23 telephonenumber: +1 415 555 0001
24 mail: Peter.Michaels@aaa.com
25 userpassword: Peter123
26
此 LDIF 文件由以下部分组成:
表 135. LDIF 文件组成部分
LDIF 更改记录
LDIF 更改记录包含对目录所进行的修改。LDIF 更改记录可以包含所有 LDAP 更新操作(添加、删除、修改和修改 DN 操作)。
LDIF 更改记录所使用的判别名限定符、特性值限定符和记录分界符的格式与 LDIF 内容记录相同。(有关详细信息,请参见LDIF 内容记录 。)根据是否出现 changetype 字段可以区分 LDIF 更改记录和 LDIF 内容记录。Changetype 字段标识更改记录所指定的操作。
changetype 字段可以使用以下五种格式之一:
表 136. Changetype 字段表格
更改类型:添加 (add)
“添加”更改记录类似于在所有特性值字段前加上 changetype: add 字段的内容更改记录(请参见LDIF 内容记录)。
所有记录必须属于同一类型。不能既有内容记录又有更改记录。
1 version: 1
2 dn: c=US
3 changetype: add
4 objectClass: top
5 objectClass: country
6
7 dn: l=San Francisco, c=US
8 changetype: add
9 objectClass: top
10 objectClass: locality
11 st: San Francisco
12
14 dn: ou=Artists, l=San Francisco, c=US
15 changetype:add
16 objectClass: top
17 objectClass: organizationalUnit
18 telephoneNumber: +1 415 555 0000
19
20 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
21 changetype: add
22 sn: Michaels
23 givenname: Peter
24 objectClass: top
25 objectClass: person
26 objectClass: organizationalPerson
27 objectClass: iNetOrgPerson
28 telephonenumber: +1 415 555 0001
29 mail: Peter.Michaels@aaa.com
30 userpassword: Peter123
31
更改类型:删除 (Delete)
因为“删除”更改记录指定删除某项,所以“删除”更改记录只需要判别名限定符字段和“删除”更改类型字段。
以下 LDIF 文件示例用于删除更改类型:添加 (add)中所示的 LDIF 文件所创建的四个项。
重要: 要删除以前添加的项,应将各项反向排序。否则,由于树枝项不为空,将导致删除操作失败。
1 version: 1
2 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
3 changetype: delete
4
5 dn: ou=Artists, l=San Francisco, c=US
8 changetype:delete
9
10 dn: l=San Francisco, c=US
11 changetype: delete
12
13 dn: c=US
14 changetype: delete
15
更改类型:修改 (Modify)
“修改”更改类型使您可以指定为已存在的项添加、删除和替换特性值。修改应使用以下三种格式之一:
表 137. 修改限定符要素
以下是“修改”更改类型的示例,将向 cn=Peter Michaels 项添加一个附加的电话号码。
1 version: 1
2 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
3 changetype: modify
4 # add the telephone number to cn=Peter Michaels
4 add: telephonenumber
5 telephonenumber: +1 415 555 0002
6
如同可以在一个 LDAP 修改请求中组合多个修改操作一样,也可以在一个 LDIF 记录中指定多个修改操作。只包含连字符 (-) 的行用于标记每个修改限定符的特性值说明的结束。
以下 LDIF 示例文件包含多个修改操作:
1 version: 1
2
3 # An empty line to demonstrate that one or more
4 # line separators between the version identifier
5 # and the first record is legal.
6
7 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
8 changetype: modify
9 # Add an additional telephone number value.
10 add: telephonenumber
11 telephonenumber: +1 415 555 0002
12 -
13 # Delete the entire fascimiletelephonenumber attribute.
14 delete: facsimileTelephoneNumber
15 -
16 # Replace the existing description (if any exists)
17 # with two new values.
18 replace: description
19 description: guitar player
20 description: solo performer
21 -
22 # Delete a specific value from the telephonenumber
23 # attribute.
24 delete: telephonenumber
25 telephonenumber: +1 415 555 0001
26 -
27 # Replace the existing title attribute with an empty
28 # set of values, thereby causing the title attribute to
29 # be removed.
30 replace: title
31 -
32
更改类型:修改 DN (Modify DN)
“修改 DN”更改类型可以重命名项和/或移动项。该更改类型由两个必需字段和一个可选字段组成。
表 138. 修改 DN 更改类型字段
以下“修改 DN”更改类型的示例说明如何重命名项:
1 version: 1
2
3 # Rename ou=Artists to ou=West Coast Artists, and leave
4 # its old RDN value.
5 dn: ou=Artists,l=San Francisco,c=US
6 changetype: moddn
7 newrdn: ou=West Coast Artists
8 deleteoldrdn: 1
9
以下“修改 DN”更改类型的示例说明如何移动项:
1 version: 1
2
3 # Move cn=Peter Michaels from
4 # ou=Artists,l=San Francisco,c=US to
5 # ou=Promotion,l=New York,c=US and delete the old RDN.
5 dn: cn=Peter Michaels,ou=Artists,l=San Francisco,c=US
6 changetype: moddn
7 newrdn: cn=Peter Michaels
8 deleteoldrdn: 1
9 newsuperior: ou=Promotion,l=New York,c=US
10
以下“修改 DN”更改类型的示例说明如何同时移动项和重命名项:
1 version: 1
2
3 # Move ou=Promotion from l=New York,c=US to
4 # l=San Francisco,c=US and rename it to
5 # ou=National Promotion.
5 dn: ou=Promotion,l=New York,c=US
6 changetype: moddn
7 newrdn: ou=National Promotion
8 deleteoldrdn: 1
9 newsuperior: l=San Francisco,c=US
10
重要: LDAP 2 修改 RDN 操作不支持移动项。如果尝试在 LDAP 2 客户程序中使用 LDIF newsuperior 语法移动项,请求将失败。
在 LDIF 文件内折行
要在 LDIF 文件中折行,只需在要折行的位置插入一个行分隔符(换行符或回车符/换行符对),其后跟一个空格。LDIF 语法分析程序遇到行首的空格时,就会自行将该行其余数据与上一行的数据相连接。前导空格继而被丢弃。
不应在多字节 UTF-8 字符的中间折行。
以下是一个带有折行的 LDIF 文件示例(请查看第 13 行和 14 行):
1 version: 1
2 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
3 sn: Michaels
4 givenname: Peter
5 objectClass: top
6 objectClass: person
7 objectClass: organizationalPerson
8 objectClass: iNetOrgPerson
9 telephonenumber: +1 415 555 0001
10 mail: Peter.Michaels@aaa.com
11 userpassword: Peter123
12 description: Peter is one of the most popular music
13 ians recording on our label. He's a big concert dr
14 aw, and his fans adore him.
15
调试 LDIF 文件
如果存在有关 LDIF 文件的问题,应参考以下内容:
启用向前参照
偶尔可能会遇到这样的 LDIF 文件,其中添加项的记录先于添加其父级的记录出现。此时将出现错误,因为当 LDAP 服务器尝试添加新项时,该项的父级并不存在。
要解决此问题,只需启用向前参照。如果启用了创建向前参照,某个项要在其父级不存在的情况下创建时,就会为该项的父级创建一个名为向前参照的占位符,从而可以成功地创建该项。如果稍后的操作创建了父项,则向前参照将更改为一般项。
LDIP 导入完成后,可能会剩余一个或多个向前参照(例如,如果 LDIF 文件从未创建某个项的父级)。在这种情况下,向前参照将在 ConsoleOneTM 中作为一种“未知”对象出现。虽然可以搜索向前参照项,但无法读取向前参照项的特性(除 objectClass 外),原因是向前参照项没有任何特性或特性值。然而,对向前参照下级的实际对象项可正常进行所有的 LDAP 操作。
区分向前参照项
向前参照项具有未知对象类,并且具有其内部的 NDS EF_REFERENCE 项标志集。在 ConsoleOne 中,具有未知对象类的项使用中央带有一个问号的黄色圆形图标表示。可以使用 LDAP 来搜索具有未知对象类的对象,尽管当前还无法通过 LDAP 访问项标志设置,以确定向前参照项。
将向前参照项更改为普通对象
可以将向前参照项更改为普通对象,只需创建该对象即可(例如使用 LDIF 文件或 LDAP 客户请求)。如果要求 eDirectory 创建已作为向前参照而存在的项,eDirectory 将把现有的向前参照项转变成要求 eDirectory 创建的对象。
使用 Novell eDirectory 导入/导出向导
要在 LDIF 导入期间启用向前参照:
-
-
在 ConsoleOne 中,选择“向导”>“NDS 导入/导出”。
-
单击“导入 LDIF 文件”>“下一步”。
-
输入包含要导入数据的 LDIF 文件的名称 > 单击“下一步”。
-
选择数据将导入的 LDAP 服务器。
-
单击“高级”>“允许向前参照”>“关闭”。
-
单击“下一步”>“完成”,开始导入 LDIF。
-
要在数据到数据的服务器迁移过程中启用向前参照:
-
-
在 ConsoleOne 中,选择“向导”>“NDS 导入/导出”。
-
单击“在 LDAP 服务器之间迁移数据”>“下一步”。
-
选择存放要迁移项的 LDAP 服务器 > 单击“下一步”。
-
指定要迁移的项的搜索准则 > 单击“下一步”。
-
选择数据将迁移到的 LDAP 服务器。
-
单击“高级”>“允许向前参照”>“关闭”。
-
单击“下一步”>“完成”。
-
使用 Novell 导入转换导出实用程序命令行界面
要在命令行界面中启用向前参照,使用 -F LDAP 目标处理程序选项。
有关详细信息,请参见LDIF 目标处理程序选项。
检查 LDIF 文件的语法
可以在处理 LDIF 文件中的记录前检查文件的语法,方法是使用“显示操作,但不执行”LDIF 源处理程序选项。
LDIF 源处理程序总是在处理 LDIF 文件中的记录时检查其语法。使用此选项可以禁止对记录进行处理,允许您校验语法。
使用 Novell eDirectory 导入/导出向导
要在 LDIF 导入过程中检查语法:
-
-
在 ConsoleOne 中,选择“向导”>“NDS 导入/导出”。
-
单击“导入 LDIF 文件”>“下一步”。
-
输入包含要导入的数据的 LDIF 文件名称 > 单击“高级”。
-
单击“显示操作,但不执行”>“关闭”>“下一步”。
-
选择数据将导入的 LDAP 服务器。
-
单击“下一步”>“完成”,开始导入 LDIF。
-
使用 Novell 导入转换导出实用程序命令行界面
要在命令行界面中检查 LDIF 文件的语法,使用 -n LDIF 源处理程序选项。
有关详细信息,请参见LDIF 源处理程序选项。
使用 LDIF 错误文件
Novell 导入转换导出实用程序将自动创建 LDIF 文件,列出所有目标处理程序无法处理的记录。可以编辑实用程序生成的 LDIF 错误文件,修复错误,然后重新将其应用到服务器,从而完成包含失败记录的导入操作或数据迁移操作。
使用 Novell eDirectory 导入/导出向导
-
-
在 ConsoleOne 中,选择“向导”>“NDS 导入/导出”。
-
单击要执行的任务。
-
单击“高级”。
-
在“日志文件”字段中,指定要记录输出讯息(包括错误讯息)的文件的名称。
-
在“失败记录的 LDIF 输出文件”字段中,指定使用 LDIF 格式输出失败项的文件的名称。
可以使用此文件检查或纠正错误。也可以将此文件修改(纠正)后的版本重新应用到目录。
-
单击“关闭”。
-
按照联机指导信息完成所选任务。
-
使用 Novell 导入转换导出实用程序命令行界面
要在命令行实用程序中配置错误日志选项,使用 -1 一般选项。
有关详细信息,请参见一般选项。
使用 LDAP SDK 调试标志
要了解某些 LDIF 问题,可能需要查看 LDAP 客户程序 SDK 的工作方式。可以为 LDAP 源处理程序和/或 LDAP 目标处理程序设置以下调试标志。
表 139. LDAP SDK 调试标志
要启用此功能,使用 LDAP 源处理程序和 LDAP 目标处理程序的 -e 选项。提供给 -e 选项的整数值是位屏蔽,用于启用 LDAP SDK 中多种类型的调试信息。
有关详细信息,请参见LDAP 源处理程序选项 和LDAP 目标处理程序选项。
使用 LDIF 扩展纲要
因为 LDIF 可以表示 LDAP 更新操作,所以可以使用 LDIF 修改纲要。
添加新对象类
要添加类,只需将符合 NDSObjectClassDescription 规范的特性值添加到 subschemaSubentry 的 objectClasses 特性中。
NDSObjectClassDescription = "(" whsp
numericoid whsp
[ "NAME" qdescrs ]
[ "DESC" qdstring ]
[ "OBSOLETE" whsp ]
[ "SUP" oids ]
[ ( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) whsp ]
[ "MUST" oids ]
[ "MAY" oids ]
[ "X-NDS_NOT_CONTAINER" qdstrings ]
[ "X-NDS_NONREMOVABLE" qdstrings ]
[ "X-NDS_CONTAINMENT" qdstrings ]
[ "X-NDS_NAMING" qdstrings ]
[ "X-NDS_NAME" qdstrings ]
whsp ")"
以下 LDIF 示例文件将向纲要中添加人员 objectClass:
1 version: 1
2 dn: cn=schema
3 changetype: add
4 objectClasses: ( 2.5.6.6 NAME 'person' DESC 'Standard
5 ObjectClass' SUP ndsLoginProperties STRUCTURAL MUST
6 (cn $ sn) MAY (description $ seeAlso $ telephoneNum
7 ber $ fullName $ givenName $ initials $ uid $ userPa
8 ssword) X-NDS_NAMING ('cn' 'uid') X-NDS_CONTAINMENT
9 ('organization' 'organizationalUnit' 'domain') X-NDS
10 _NAME 'Person' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMO
11 VABLE '1')
12
必备特性
必备特性在对象类说明的 MUST 部分列出。对于 person 对象类,必备特性是 cn 和 sn。
可选特性
可选特性在对象类说明的 MAY 部分列出。person 对象类中的可选特性是 description、seeAlso、telephoneNumber、fullName、givenName、initials、uid 和 userPassword。
包容规则
对象类说明的 X-NDS_CONTAINMENT 部分提供可以包含定义的对象类的对象类。organization、organizationalUnit 和 domain 对象类可以包含 person 对象类。
添加新特性
要添加特性,只需将符合 NDSAttributeTypeDescription 规范的特性值添加到 subschemaSubentry 的 attributes 特性中。
NDSAttributeTypeDescription = "(" whsp
numericoid whsp ; AttributeType identifier
[ "NAME" qdescrs ] ; name used in AttributeType
[ "DESC" qdstring ] ; description
[ "OBSOLETE" whsp ]
[ "SUP" woid ] ; derived from this other AttributeType
[ "EQUALITY" woid] ; Matching Rule name
[ "ORDERING" woid] ; Matching Rule name
[ "SUBSTR" woid ] ; Matching Rule name
[ "SYNTAX" whsp noidlen whsp ] ; Syntax OID
[ "SINGLE-VALUE" whsp ] ; default multi-valued
[ "COLLECTIVE" whsp ] ; default not collective
[ "NO-USER-MODIFICATION" whsp ] ; default user modifiable
[ "USAGE" whsp AttributeUsage ] ; default userApplications
[ "X-NDS_PUBLIC_READ" qdstrings ]
; default not public read ('0')
[ "X-NDS_SERVER_READ" qdstrings ]
; default not server read ('0')
[ "X-NDS_NEVER_SYNC" qdstrings ]
; default not never sync ('0')
[ "X-NDS_NOT_SCHED_SYNC_IMMEDIATE" qdstrings ]
; default sched sync immediate ('0')
[ "X-NDS_SCHED_SYNC_NEVER" qdstrings ]
; default schedule sync ('0')
[ "X-NDS_LOWER_BOUND" qdstrings ]
; default no lower bound('0')
;(upper is specified in SYNTAX)
[ "X-NDS_NAME_VALUE_ACCESS" qdstrings ]
; default not name value access ('0')
[ "X-NDS_NAME" qdstrings ] ; legacy NDS name
whsp ")"
以下 LDIF 示例文件将向纲要中添加 title 特性类型:
1 version: 1
2 dn: cn=schema
3 changetype: add
4 attributeTypes: ( 2.5.4.12 NAME 'title' DESC 'Standa
5 rd Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{
6 64} X-NDS_NAME 'Title' X-NDS_NOT_SCHED_SYNC_IMMEDIA
7 TE '1' X-NDS_LOWER_BOUND '1')
8
单值特性与多值特性
除非明确将特性设置为单值,否则其默认设置为多值。以下 LDIF 示例文件通过在 SYNTAX 部分后面添加 SINGLE-VALUE 关键字,将 title 设置为单值:
1 version: 1
2 dn: cn=schema
3 changetype: add
4 attributeTypes: ( 2.5.4.12 NAME 'title' DESC 'Standa
5 rd Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{
6 64} SINGLE-VALUE X-NDS_NAME 'Title' X-NDS_NOT_SCHED
7 _SYNC_IMMEDIATE '1' X-NDS_LOWER_BOUND '1')
8
向现有对象类中添加可选特性
尽管可以采用添加新纲要元素的方法,但是修改或扩展现有的纲要元素通常是非常危险的。因为每个纲要元素都由 OID 唯一标识,如果扩展标准纲要元素,实际上就创建了该元素的第二个定义,即使它仍然使用原来的 OID。这样会导致不兼容的问题。
有时更改纲要元素更合适。例如,在开发过程中简化新的纲要元素时,可能就需要对其进行扩展或修改。通常不要将新特性直接添加到类中,而是应该只使用辅助类来执行以下操作:
-
- 向现有对象类中添加新特性
- 建立现有对象类的子类
Adding or Removing Auxiliary Classes
下面的 LDIF 文件样本创建两个新特性、创建一个具有这些特性的辅助类,然后添加一个 inetOrgPerson 项(该项将该辅助类作为其对象类,并带有该辅助类特性值)。
version: 1
# Add an attribute to track a bear's hair. The attribute is
# multi-valued, uses a case ignore string syntax,
# and has public read rights
# Values may include: long hair, short, curly, straight,
# none, black, and brown
# X-NDS_PUBLIC_READ '1' The 1 allows public read,
# 0 denies public read
dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 2.16.840.1.113719.1.186.4.10 NAME
'bearHair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
X-NDS_PUBLIC_READ '1' )
# add an attribute to store a bear's picture
dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 2.16.840.1.113719.1.186.4.11 NAME
'bearPicture' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5
SINGLE-VALUE )
# create an Auxiliary class for the bearfeatures
dn: cn=schema
changetype: modify
add: objectclasses
objectclasses: (2.16.840.1.113719.1.186.6.101 NAME
'bearFeatures' MAY (bearHair $ bearPicture) AUXILIARY)
# now create a user named booboo
dn: cn=booboo,o=jellystone
changetype: add
cn: booboo
sn: bear
givenName: booboo
bearHair: Short
bearHair: Brown
bearHair: Curly
bearPicture:< file:///c:/tmp/alien.jpg
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: bearFeatures
# now create a person named yogi that will later be changed
# into a bear when bearFeatures is added to its objectClass
# list
dn: cn=yogi,o=jellystone
changetype: add
cn: yogi
sn: bear
givenName: yogi
objectClass: top
objectClass: person
objectClass: inetOrgPerson
# now morph yogi into a bear by adding bearFeatures
dn: cn=yogi,o=jellystone
changetype: modify
add: objectClass
objectClass: bearFeatures
-
add: bearHair
bearHair: long
bearHair: black
#bearPicture:< file:///c:/tmp/yogi.jpg>
-
# to morph yogi back to a person, simply delete the
# objectClass bearFeatures
dn: cn=yogi,o=jellystone
changetype: modify
delete: objectClass
objectClass: bearFeatures
在将辅助类从 objectClass 列表中去除时,您不必删除与该辅助类相关连的所有值。
如果该辅助类具备“MUST”特性,必须在将该辅助类添加到 objectClass 列表的同一修改操作中指定这些特性,否则修改将会失败。