python-ldapを使ってldapsearchもどき

simple bind(パスワード認証)限定なldapクライアントがほしかったのでpython ldapを使ってldapsearchもどきを作りました。

ソース

## python-ldap,python-pit are required
import ldap,ldif
from pit import Pit
import sys,optparse,getpass

## configuration
defaults = Pit.get('ldap.config',{'require' : {
                    'uri':'ldap://ldap.example.com',
                    'base_dn':'dc=example,dc=com',
                    'bind_dn':'uid=hoge,dc=example,dc=com',
                    'bind_password':'Password for binding',
                    }})

## Options. like LDAPSEARCH(1)
optparser = optparse.OptionParser()
optparser.add_option('-b', '--basedn', dest='base_dn', default=defaults['base_dn'])
optparser.add_option('-D', '--binddn', dest='bind_dn', default=defaults['bind_dn'])
optparser.add_option('-H', dest='ldap_uri', default=defaults['uri'])
optparser.add_option('-x', action='store_true', dest='is_anonymous')
optparser.add_option('-w', dest='bind_password', default=defaults['bind_password'])
optparser.add_option('-W', action='store_true', dest='prompt_password')

opts, args = optparser.parse_args()
ldap_uri = opts.ldap_uri
base_dn = opts.base_dn
bind_dn = opts.bind_dn
bind_password = opts.bind_password
if opts.is_anonymous:
    bind_dn = ''
    bind_password = ''
elif opts.prompt_password:
    bind_password = getpass.getpass("Enter LDAP Password: ")

## connect to ldap server
lo = ldap.initialize(ldap_uri)
lo.simple_bind_s(bind_dn, bind_password)

## search
# args are search fileter and attributes you want
if len(args) > 0:
    result = lo.search_s(base_dn, ldap.SCOPE_SUBTREE, args[0], args[0:])
# search all
else:
    result = lo.search_s(base_dn, ldap.SCOPE_SUBTREE)

## output ldif
ldif_writer=ldif.LDIFWriter(sys.stdout)
for dn,entry in result:
    ldif_writer.unparse(dn,entry)

使い方

ldapsearchに似た感じです。Pitでデフォルトのbase DNなどを保存します。

パスワードを聞かれる検索
python pyldapsearch.py -W
フィルタや欲しい属性の指定
python pyldapsearch.py '(uid=joma)' sn mail
匿名検索
python pyldapsearch.py -x
いろいろオプションつけて検索
python pyldapsearch.py -b 'dc=example,dc=com' -D 'uid=joma,dc=example,dc=com' -H 'ldap://ldap.example.com' -w password

メモ

  • search_sの_sはsynchronous、同期処理
  • searchの範囲は、SCOPE_BASE,SCOPE_ONELEVEL,SCOPE_SUBTREE(それぞれ、自分、自分と子供まで、自分以下のツリー全体)
  • Pitは環境変数EDITORの設定が必要