我正在编写一些 ldap 自动化脚本,但遇到了一点小问题。基本上,我想在尝试添加属性之前检查要添加到条目的属性是否确实存在于给定的对象类中。
到目前为止,我对此最好的想法就是在属性的架构定义文件上运行正则表达式,但这不能解释在配置初始化后编辑架构文件的情况。
第二个想法是,如果无法添加属性,则仅捕获引发的错误,但这似乎效率较低,因为我的下一步将是将属性添加到模式并重建配置。
似乎应该有一个简单的 ldapsearch 命令来执行此操作,但我不明白其语法。
到目前为止我已经尝试过:
ldapsearch -x -b 'dc=MY_DOMAIN,dc=com' '(objectclass=mySCHEMA)'
但这仅列出了任何具有 mySCHEMA 对象类的 ldap 条目。
谢谢您的帮助,干杯!
答案1
您正在寻找subschemaSubentry
。
RFC 2252
轻量级目录访问协议 (v3):属性语法定义
5.1.5. subschema子条目
此属性的值是子模式条目的名称(如果服务器基于 X.500(93),则为子条目),服务器在其中提供指定模式的属性。
( 2.5.18.10 NAME 'subschemaSubentry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION SINGLE-VALUE USAGE directoryOperation )
你可以像这样找到它:
$ ldapsearch -s base -b '' subschemaSubentry
dn:
subschemaSubentry: cn=Subschema
$ ldapsearch -s base -b cn=Subschema objectClasses
一行代码:
ldapsearch -s base -b $(ldapsearch -s base -b '' subschemaSubentry | sed '/dn:/d;/^$/d;s/subschemaSubentry: //' ) objectClasses
如果您使用 bash 编写脚本并且您的 ldapsearch 版本支持它,-o ldif-wrap=no
则意味着您不必解析 ldif 换行。
cn=schema,cn=config
虽然很方便,但由于从 继承的访问控制,通常在 OpenLDAP 下不可用cn=config
。
答案2
这是我用来展示具体的objectClass,例如organizationalRole
$ ldapsearch -s base -b cn=Subschema objectClasses -LLL -o ldif-wrap=no |\
sed -nr '/organizationalRole/ p' | sed -r 's/[$()]+/\n /g'
答案3
我使用 LDAP 已经有很长时间了,但我认为每个 LDAP 服务器都可能以特定的后缀公开模式。
我认为在 Openldap 中,您可以在基本“cn=schema, cn=config”中搜索以查找当前架构。尝试类似操作ldapsearch -x -s sub -b "cn=schema,cn=config" '(objectclass=*)'
以查看结果。(尚未测试此命令行,但您明白了...)。
从开发人员的角度来看,我希望存在正确的模式,并且处理对象类冲突的异常,就好像它是任何类型的错误一样。
我认为改变模式不应该由添加/删除数据的应用程序来处理,而应该由软件的安装过程来处理。
答案4
如果你更喜欢 GUI 解决方案,请下载 LDAP 浏览器,例如免费的开源跨平台探索者一旦连接到 LDAP,它允许您浏览(和编辑)所有对象及其属性。