SqueezeでPerlの「Net::LDAP」とシェルで検索する

■「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
#!/usr/bin/perl
use Net::LDAP;
use Net::LDAP::LDIF;

# LDAP Server Name ,LDAP Port,LDIF Version

$ldap = Net::LDAP->new(
        'lpic3.openldap.local',
        port    => 389,
        version => 3
        ) or die $!;

# Administration User,password

$mesg = $ldap->bind(
        'cn=admin,dc=openldap,dc=local',
        password => 'PASSWORD'
        );

die $mesg->error() if $mesg->code();

# Serch Filter

$mesg = $ldap->search(
        base   => 'ou=Group,dc=openldap,dc=local',
        scope  => 'one',
        filter => '(objectClass=*)'
        );

die $mesg->error() if $mesg->code();

# LDIF

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

■まあ、シェルでなんとかなるものです。