概要
LDAPでアカウントを管理しているとuid一覧を取得したくなったりメールアドレス一覧を取得したくなったりします。
ldapsearchコマンドでも実現可能ですがPerlでNet::LDAPを使ってスクリプトを書いてみました。
サンプル
エントリ内のデータを全て表示
#!/usr/bin/env perl use strict; use warnings; use Net::LDAP; my $ldap; my $msg; # 接続先サーバーの定義 my $LDAP_HOST = "ldap.example.com"; my $LDAP_DN = undef; my $LDAP_PW = undef; # 検索条件の定義 my $SEARCH_BASE = "ou=Users,dc=example,dc=com"; my $SEARCH_FILTER = "(&(objectclass=inetOrgPerson)(uid=*))"; # LDAPサーバーへの接続 $ldap = Net::LDAP->new($LDAP_HOST) or die $@; # bind if (defined $LDAP_DN) { $msg = $ldap->bind($LDAP_DN, password => $LDAP_PW); } else { $msg = $ldap->bind(); } if ($msg->code) { die $msg->error; } # 検索 $msg = $ldap->search( base => $SEARCH_BASE, filter => $SEARCH_FILTER, ); # 各エントリの取得 #foreach my $entry ($msg->entries) { # 各エントリツリー表示 my $dn = $entry->dn; print "dn: $dn\n"; foreach my $attr ($entry->attributes) { foreach my $val ($entry->get_value($attr)) { print "$attr: $val\n"; } } # 問い合わせ結果を表示 print "\n"; } # unbind $ldap->unbind; exit 0;
特定の属性の値だけ表示
上記スクリプトは各LDAPアカウントのデータを全て表示させるものですが、
以下のように変更すると特定のattributesの値が取得出来ます。
# 各エントリの取得 foreach my $entry ($msg->entries) { # 各エントリツリー表示 my $dn = $entry->dn; print "dn: $dn\n"; foreach my $attr ($entry->attributes) { foreach my $val ($entry->get_value($attr)) { print "$attr: $val\n"; } } # 問い合わせ結果を表示 print "\n"; }
↓
foreach my $entry ($msg->entries) { print "uid=", $entry->get_value('uidNumber'), "(", $entry->get_value('uid'), ")", "\n";
表示例
uid=1000(tsunokawa)
こんな感じでidコマンドの結果のように特定属性のみ取得して表示させることが出来るようになります。
またメールアドレス一覧を取得したくなったら以下のように変更すると取得可能です。
print $entry->get_value('mail'),"\n";