我在Mac OS X Server 10.6上使用openldap,需要为给定组中的所有用户生成vcard。通过使用ldapsearch,我可以列出该组中所有用户的所有memberUid。我找到了一个由人员编写的perl脚本(高级LDAP搜索或ALS),可以轻松生成vcard。可在此处找到ALS http://www.ldapman.org/tools/als.gz
所以我需要做的是创建一个包装脚本(在python或perl中),它将有效地遍历memberUid并运行ALS命令来创建vcard并将其附加到文件中。
此命令提供memberUid的:
ldapsearch -x -b 'dc=ldap,dc=server,dc=com' '(cn=testgroup)'
然后运行ALS给出了vcard:
als -b dc=ldap,dc=server,dc=com -V uid=aaronh > vcardlist.vcf
如果使用Perl更容易做到这一点,因为ALS已经在使用它,这样会很好。我在python中做了更多的工作,但我愿意接受建议。
提前致谢, 亚伦
修改
以下是我必须安排的Net:LDAP代码的链接。到目前为止,它用所有用户信息下拉了ldap条目。我缺少的是如何捕获每个用户的UID,然后将其推入ALS。
http://www.queencitytech.com/net-ldap
以下是一个示例条目(在运行上述链接中的代码之后):
#-------------------------------
DN: uid=aaronh,cn=users,dc=ldap,dc=server,dc=com
altSecurityIdentities : Kerberos:aaronh@LDAP.SERVER.COM
apple-generateduid : F0F9DA73-70B3-47EB-BD25-FE4139E16942
apple-imhandle : Jabber:aaronh@ichat.server.com
apple-mcxflags : <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>simultaneous_login_enabled</key>
<true/>
</dict>
</plist>
authAuthority : ;ApplePasswordServer;0x4c11231147c72b59000001f800001663,1024 35 131057002239213764263627099108547501925287731311742942286788930775556419648865483768960345576253082450228562208107642206135992876630494830143899597135936566841409094870100055573569425410665510365545238751677692308677943427807426637133913499488233527734757673201849965347880843479632671824597968768822920700439 root@ldap.server.com:192.168.1.175;Kerberosv5;0x4c11231147c72b59000001f800001663;aaronh@LDAP.SERVER.COM;LDAP.SERVER.COM;1024 35 131057002239213764263627099108547501925287731311742942286788930775556419648865483768960345576253082450228562208107642206135992876630494830143899597135936566841409094870100055573569425410665510365545238751677692308677943427807426637133913499488233527734757673201849965347880843479632671824597968768822920700439 root@ldap.server.com:192.168.1.170
cn : Aaron Hoffman
gidNumber : 20
givenName : Aaron
homeDirectory : 99
loginShell : /bin/bash
objectClass : inetOrgPersonposixAccountshadowAccountapple-userextensibleObjectorganizationalPersontopperson
sn : Hoffman
uid : aaronh
uidNumber : 2643
userPassword : ********
#-------------------------------
答案 0 :(得分:1)
我选择的语言是Perl - 但这只是因为我使用Perl和LDAP完成了类似的操作。
如果我没记错的话,那个ldapsearch命令会为testgroup cn中的每个uid提供完整的LDIF条目。如果是这种情况,那么在准备好als部分之前,你需要稍微清理一下。虽然它绝对不是最优雅的解决方案,但快速而肮脏的方法是使用反引号并通过grep运行命令的输出。这将返回所有memberUids的一个很好的列表。从那里它只是一个简单的foreach循环,你就完成了。没有任何测试或确定你的LDAP输出是什么样的,我会选择这样的东西:
#!/usr/bin/perl
# should return a list of "memberUid: name" entries
@uids = `ldapsearch -x -b 'cn=testgroup,cn=groups,dc=ldap,dc=server,dc=com' | grep memberUid:`;
foreach (@uids) {
$_ =~ s/memberUid: //; # get rid of the "uid: " part, leaving just the name
chomp $_; # get rid of the pesky newline
system "als -b \"dc=ldap,dc=server,dc=com\" -V uid=$_ >> vcardlist.vcf";
}
正如我所说,我没有对此进行测试,而且我不确定你的ldapsearch的输出是什么样的,所以你可能需要调整一下以满足你的确切需求。这应该足以让你继续前进。
如果有人有更好的主意,我也很乐意听到它。