使用ldapmodify批量修改目录节点属性


问题:
在ou=People,o=abc,dc=super, dc=com树下放了10000个用户节点(objectClass=inetOrgPerson, objectClass=inetuser)。其中有超过9000个用户的属性inetuserstatus的值为不正确的"true",需要更正为 "Active"。

解决方法:
由 于需要修改的目录节点数目十分庞大,手工书写修改命令不太可行。所以,需要考虑用工具生成。考虑到ldapsearch的输出可以指定属性,可以在 ldapsearch输出的基础上加以修改得到最终的LDIF文件。首先,利用ldapsearch得到所有需要修改的目录节点的dn,并保存到文件 need_chg.dn:
ldapsearch -D "cn=Directory Manager" -w password -b "ou=People,o=abc,dc=super,dc=com" "(inetuserstatus=true)" dn > need_chg.dn
得到的need_chg.dn文件示例如下:
uid=xulingyan,ou=people,o=abc,dc=super,dc=com

uid=tn0001,ou=people,o=abc,dc=super,dc=com

uid=tn0002,ou=people,o=abc,dc=super,dc=com

uid=tn0003,ou=people,o=abc,dc=super,dc=com

uid=tn0004,ou=people,o=abc,dc=super,dc=com


然后编写sed脚本在每个dn前面加上"dn: ",并加上以下行:
changetype: modify
replace: inetuserstatus
inetuserstatus: Active

修改后的need_chg.dn文件示例如下:
dn: uid=xulingyan,ou=people,o=abc,dc=super,dc=com
changetype: modify
replace: inetuserstatus
inetuserstatus: Active

dn: uid=tn0001,ou=people,o=abc,dc=super,dc=com
changetype: modify
replace: inetuserstatus
inetuserstatus: Active

dn: uid=tn0002,ou=people,o=abc,dc=super,dc=com
changetype: modify
replace: inetuserstatus
inetuserstatus: Active

dn: uid=tn0003,ou=people,o=abc,dc=super,dc=com
changetype: modify
replace: inetuserstatus
inetuserstatus: Active

dn: uid=tn0004,ou=people,o=abc,dc=super,dc=com
changetype: modify
replace: inetuserstatus
inetuserstatus: Active

该sed脚本应该如下:

/^uid=/ {
a\
changetype: modify\
replace: inetuserstatus\
inetuserstatus: Active
s/uid/dn: uid/
}

最后,运行ldapmodify -h host -p port -D <bind dn=""> -w<password> -f <ldif file="">即可。

总结:
熟悉LDIF文件格式并有效运文本处理工具可以高效率地解决一些看似棘手的难题。
</ldif></password></bind>

 

你可能感兴趣的:(脚本,F#)