分类: 系统运维
2011-05-06 10:35:00
问题:
在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
ldapsearch -D "cn=Manager,dc=nsk,dc=northstar.com.tw" -w secret -b "uid=ethan.xie,ou=People,dc=nsk,dc=northstar.com.tw"
得到的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 -w -f 即可。
总结:
熟悉LDIF文件格式并有效运文本处理工具可以高效率地解决一些看似棘手的难题。
***注意:在两个条目间要加空行