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的输出看起来像,所以你可能需要调整一下,以适应你的确切需求。这应该足以让你走了。

如果有人有更好的主意,我也很想听到它。

+0

看起来它应该对我有用。我多年没有使用LDAP,但是当我使用Net :: LDAP pure-Perl库时。虽然LDAP处理的内容无论如何都在这个外部als脚本中,但在这里它并不会太有用,但可以用来替换ldapsearch调用。 – araqnid 2010-06-09 22:19:18

+0

是的,你是完全正确的。 Net :: LDAP当然可以在这里用来获取UID,但是要花更多的时间和精力来开展工作 - 我认为,远比OP希望在ldapsearch易于使用一次性脚本时花费更多的工作量可用。 – 2010-06-09 22:51:44

+0

感谢您的帮助。我需要做一些改变。当我运行ldapsearch时,它将每个uid输出为“memberUid”。此外,阿尔斯无法找到,所以我需要告诉它使用Perl。现在,vcardlist.vcf会输出,但是该文件似乎只有测试组vcard以及另一个所有用户也都参与的组。任何想法为什么会这样做? – Aaron 2010-06-10 11:52:39