ldapsearch和创建电子名片
我在Mac OS X Server 10.6上使用openldap,需要为给定组中的所有用户生成一个vcard。通过使用ldapsearch,我可以列出该组中所有用户的所有memberUid。我发现一个perl脚本(高级LDAP搜索或ALS)是由某人轻松生成vcard所写的。 ALS可以在这里找到http://www.ldapman.org/tools/als.gzldapsearch和创建电子名片
所以我需要做的是创建一个包装脚本(在Python或Perl),将有效地循环通过memberUid和运行ALS命令来创建vcard并将其附加到文件。
此命令可以使用memberUid的:
ldapsearch -x -b 'dc=ldap,dc=server,dc=com' '(cn=testgroup)'
然后运行ALS给电子名片:
als -b dc=ldap,dc=server,dc=com -V uid=aaronh > vcardlist.vcf
如果它更容易做到这一点,因为ALS已经在使用它使用Perl,这将是罚款。我已经在Python中做了更多的工作,但我愿意接受建议。
由于提前, 亚伦
编辑:
这里是到网上的链接:LDAP代码,我要约会。到目前为止,它使用所有用户信息来拉取ldap条目。我缺少的是如何捕获每个用户的UID,然后将其推入ALS。
http://www.queencitytech.com/net-ldap
下面是一个例子条目(运行从上面的链接代码后):
#-------------------------------
DN: uid=aaronh,cn=users,dc=ldap,dc=server,dc=com
altSecurityIdentities : Kerberos:[email protected]
apple-generateduid : F0F9DA73-70B3-47EB-BD25-FE4139E16942
apple-imhandle : Jabber:[email protected]
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 [email protected]:192.168.1.175;Kerberosv5;0x4c11231147c72b59000001f800001663;[email protected];LDAP.SERVER.COM;1024 35 131057002239213764263627099108547501925287731311742942286788930775556419648865483768960345576253082450228562208107642206135992876630494830143899597135936566841409094870100055573569425410665510365545238751677692308677943427807426637133913499488233527734757673201849965347880843479632671824597968768822920700439 [email protected]: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 : ********
#-------------------------------
我选择的语言将是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的输出看起来像,所以你可能需要调整一下,以适应你的确切需求。这应该足以让你走了。
如果有人有更好的主意,我也很想听到它。
看起来它应该对我有用。我多年没有使用LDAP,但是当我使用Net :: LDAP pure-Perl库时。虽然LDAP处理的内容无论如何都在这个外部als脚本中,但在这里它并不会太有用,但可以用来替换ldapsearch调用。 – araqnid 2010-06-09 22:19:18
是的,你是完全正确的。 Net :: LDAP当然可以在这里用来获取UID,但是要花更多的时间和精力来开展工作 - 我认为,远比OP希望在ldapsearch易于使用一次性脚本时花费更多的工作量可用。 – 2010-06-09 22:51:44
感谢您的帮助。我需要做一些改变。当我运行ldapsearch时,它将每个uid输出为“memberUid”。此外,阿尔斯无法找到,所以我需要告诉它使用Perl。现在,vcardlist.vcf会输出,但是该文件似乎只有测试组vcard以及另一个所有用户也都参与的组。任何想法为什么会这样做? – Aaron 2010-06-10 11:52:39