LDIF 添加/替换语法?

LDIF 添加/替换语法?

(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 -1ldapmodifyslapd-d -1ldapmodify

相关内容