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の設定が必要