(slapd 2.4.47+dfsg-3+deb10u3 - 来自 Debian 10)
我已经搜索过有关该问题的先前答案,但尽管按照建议(使用changetype: modify
),我仍然遇到问题。
问题是需要能够编写一个包含新元素和需要修改的现有元素的 LDIF 文件。
但是,以下两种方法均不起作用。
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: foo
-
add: olcTLSCertificateFile
olcTLSCertificateFile: foo
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: foo
-
add: olcTLSCipherSuite
olcTLSCipherSuite: foo
-
add: olcTLSVerifyClient
olcTLSVerifyClient: foo
运行时ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/myconfigs/ldifs/certs.ldif"
出现以下错误:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
ldap_modify: Inappropriate matching (18)
additional info: modify/add: olcTLSCACertificateFile: no equality matching rule
如果我适应一种replace
风格:
dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: foo
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: foo
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: foo
-
replace: olcTLSCipherSuite
olcTLSCipherSuite: foo
-
replace: olcTLSVerifyClient
olcTLSVerifyClient: foo
错误变为:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
ldap_modify: Other (e.g., implementation specific) error (80)
正确的语法是什么“若不存在则添加,若存在则替换”?
答案1
实际替换是“如果不存在则添加,如果存在则替换”。
rfc2849状态
“修改目录的 LDAP 操作(添加、删除、修改和 modrdn)与下面描述的更改记录类型(“添加”、“删除”、“修改”和“modrdn”或“moddn”)之间存在一一对应关系。这种对应关系是有意为之,并允许从 LDIF 更改记录直接转换为协议操作。”
好的,让我们看看这些协议操作应该如何工作rfc4511,第 4.6 节。
“替换:用列出的新值替换修改属性的所有现有值,如果属性尚不存在,则创建该属性。如果属性存在,则不带值的替换将删除整个属性,如果属性不存在,则忽略该替换。”
好的,这甚至更好,它是“如果不存在则添加”,“如果存在则替换”甚至“删除”。
我们来尝试一下。
假设我的目录中有这个实体。
dn: cn=timor,ou=people,dc=orga,dc=tld
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: posixAccount
objectClass: top
cn: timor
gidNumber: 10001
homeDirectory: /home/timor
sn: None
uid: timor
uidNumber: 10001
displayName: Timor
givenName: Timor
userPassword:: <stripped>
我设置了这个 LDIF,它mail
向实体添加了三个值,不是使用“添加”而是使用“替换”。
dn: cn=timor,ou=people,dc=orga,dc=tld
changetype: modify
replace: mail
mail: first
mail: second
mail: third
只需将其修改为目录即可。
timor@somehost ~ $ ldapmodify -x -H ldaps://localhost -D "cn=Manager,dc=orga,dc=tld" -w "superSecret" -f /tmp/3mail.ldif
modifying entry "cn=timor,ou=people,dc=orga,dc=tld"
效果很好。 (我不会粘贴更多 LDIF,我相信您相信这些值就在那里)
所以这实际上表明还有其他问题。不幸的是,OpenLDAP 的错误消息“ldap_modify:其他(例如,特定于实现的)错误(80)”也没什么帮助。我见过不止一次,而且经常是因为完全不同的原因,例如违反架构、权限问题等等。
我的建议是坚持使用第二个 ( ) 代码片段,并在发出命令时changetype: modify
打开调试。如果这没有帮助 - 我担心它不会 - 您可以对其本身执行相同的操作,使用相同的选项,并在发出命令时仔细查看日志文件。-d -1
ldapmodify
slapd
-d -1
ldapmodify