ldapsearch 和 vCard 创建

0 投票
1 回答
2057 浏览
提问于 2025-04-15 23:45

我在Mac OS X Server 10.6上使用openldap,想为某个组里的所有用户生成一个vcard。通过使用ldapsearch,我可以列出该组中所有用户的memberUid。然后我找到一个叫做Advanced LDAP Search(ALS)的perl脚本,这个脚本可以很方便地生成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已经是用Perl写的,那也没问题。我在python方面做得更多,但我也愿意听取建议。

提前谢谢你, Aaron

编辑:

这是我目前为止的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 : ********
#-------------------------------

1 个回答

1

我选择的编程语言是Perl,因为我之前用Perl和LDAP做过类似的操作。

如果我没记错的话,ldapsearch这个命令会给你测试组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输出是什么样的,所以你可能需要稍微调整一下,以满足你的具体需求。不过这应该足够让你开始了。

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

撰写回答