■「Net::LDAP」モジュールの導入
SqueezeにはパッケージがあるのでCPANは使わない。
$ apt-cache search Net::LDAP | grep perl
libauthen-sasl-cyrus-perl - Perl extension for Cyrus SASL library
libnet-ldap-perl - client interface to LDAP servers
libnet-ldap-server-perl - LDAP server-side protocol handling in Perl
libnet-ldapapi-perl - Perl bindings for OpenLDAP C API
$ apt-cache search Net::LDAP | grep perl | awk '{print $1}' | sudo apt-get install -y `xargs`
$ type perl | awk '{print $3}'
/usr/bin/perl
$ perl -MNet::LDAP -e 1 && echo "ok"
ok
■参考
Peter Marschall > perl-ldap-0.55 > Net::LDAP
http://search.cpan.org/~marschap/perl-ldap-0.55/lib/Net/LDAP.pod
PerlでLDAP検索、しかも全検索
http://d.hatena.ne.jp/askadna/20080326
Book: Perlを使ったLDAPアクセス -Net::LDAP Search and Add-
http://nwing.knowd.co.jp/yamazaki/?q=node/134
■「base.pl」を作成
strictがエラーになったり、
ローカル変数はシェルで書き換えるからいいやとか
エラーは最小限いういい加減さ。
$ cat base.perl
use Net::LDAP;
use Net::LDAP::LDIF;
$ldap = Net::LDAP->new(
'lpic3.openldap.local',
port => 389,
version => 3
) or die $!;
$mesg = $ldap->bind(
'cn=admin,dc=openldap,dc=local',
password => 'PASSWORD'
);
die $mesg->error() if $mesg->code();
$mesg = $ldap->search(
base => 'ou=Group,dc=openldap,dc=local',
scope => 'one',
filter => '(objectClass=*)'
);
die $mesg->error() if $mesg->code();
if ( $mesg->count() > 0 ) {
$ldif = Net::LDAP::LDIF->new(\*STDOUT,"w") or die $!;
$ldif->write($mesg->all_entries());
}
$ldap->unbind();
exit(0);
■パスワードを変えて検索。
まさか、「PASSWORD」や「mypassword」じゃないですよね。。。
$ sed s/PASSWORD/mypassword/ base.perl | \
perl -
dn: cn=ldapgroup,ou=Group,dc=openldap,dc=local
objectClass: posixGroup
cn: ldapgroup
gidNumber: 10000
memberUid: ldapuser
■「ou=People」を検索
$ sed s/PASSWORD/mypassword/ base.perl | \
sed s/"ou=Group"/"ou=People"/ | \
perl -
dn: uid=ldapuser,ou=People,dc=openldap,dc=local
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
uid: ldapuser
userPassword: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uidNumber: 10000
gidNumber: 10000
loginShell: /bin/bash
homeDirectory: /home/ldapuser
cn: OpenLdap Div
dn: cn=ldapuser,ou=People,dc=openldap,dc=local
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: ldapuser
sn: user
mail: ldapuser@openldap.local
displayName: ldapuser
uid: ldapuser
■「ou=Group,」を止めて、スコープを「sub」に、
「(objectClass=posixAccount)」の条件で検索。
※「(objectClass=posixAccount)」で条件を絞らないとtopからすべての検索になる。
$ sed s/PASSWORD/mypassword/ base.perl | \
sed s/"ou=Group,"// | \
sed s/"one"/"sub"/ | \
sed s/'(objectClass=\*)'/'(objectClass=posixAccount)'/ | \
perl -
dn: uid=ldapuser,ou=People,dc=openldap,dc=local
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
uid: ldapuser
userPassword: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uidNumber: 10000
gidNumber: 10000
loginShell: /bin/bash
homeDirectory: /home/ldapuser
cn: OpenLdap Div
■まあ、シェルでなんとかなるものです。