1. windows + python2.7 安装 python-ldap

    https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap

2.python 同步密码

  1. # encoding: utf-8
  2. """
  3. Created by Jeff Liu on 2019/12/2
  4. """
  5. import ldap
  6. import re
  7. PORTAL_LDAP = {
  8. 'bind_dn': '',
  9. 'bind_pass': '',
  10. 'ldap_server': '',
  11. 'port':"",
  12. 'user_dn': '',
  13. 'group_dn': ''
  14. }
  15. DEVOPS_LDAP = {
  16. 'bind_dn': '',
  17. 'bind_pass': '',
  18. 'ldap_server': '',
  19. 'port':"",
  20. 'user_dn': '',
  21. 'group_dn': ''
  22. }
  23. def connect_ldap(my_ldap):
  24. """
  25. 建立ldap连接
  26. :param my_ldap: ldap连接信息
  27. :return: 返回ldap连接对象
  28. """
  29. ip = my_ldap['ldap_server']
  30. port = my_ldap['port']
  31. bind_dn = my_ldap['bind_dn']
  32. bind_pass = my_ldap['bind_pass']
  33. # 如果是ldaps, 需要指定CA cert file
  34. # ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, "/path/to/ldaps.cert.file")
  35. # 如果是self-signed cert, 加上这行
  36. ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
  37. # 初始化LDAP连接
  38. ldap_connect = ldap.initialize('ldap://' + ip + ':' + port)
  39. ldap_connect.set_option(ldap.OPT_REFERRALS, 0)
  40. ldap_connect.protocol_version = ldap.VERSION3
  41. ldap_connect.simple_bind_s(bind_dn, bind_pass)
  42. print("ldap: {} is connected.".format(ip))
  43. return ldap_connect
  44. def get_password(ldap_connect, uid, user_dn):
  45. """
  46. 获取用户密码(加密)
  47. :param ldap_connect: ldap连接对象
  48. :param uid: 用户账号
  49. :param user_dn: 用户base dn
  50. :return: 用户密码信息
  51. """
  52. try:
  53. result_set = ldap_connect.search_s(user_dn, ldap.SCOPE_SUBTREE, 'uid=' + uid)
  54. name, attrs = result_set[0]
  55. if hasattr(attrs, 'has_key') and attrs.has_key('uid'):
  56. userPassword = attrs['userPassword'][0]
  57. return userPassword
  58. else:
  59. print "get_password error: %s not found." %uid
  60. return None
  61. except Exception, e:
  62. print "get_password error: uid=%s, %s" %(uid, str(e))
  63. return None
  64. def change_password(ldap_to_connect, uid, user_dn, new_password):
  65. """
  66. 修改用户密码
  67. :param ldap_to_connect: ldap连接对象
  68. :param uid: 用户账号
  69. :param user_dn: 用户base dn
  70. :param new_password: 新密码
  71. :return: 用户密码
  72. """
  73. try:
  74. dn = 'uid=%s, %s' %(uid, user_dn)
  75. modlist = [(ldap.MOD_REPLACE, 'userPassword', new_password)]
  76. ldap_to_connect.modify_s(dn, modlist)
  77. return True
  78. except Exception,e:
  79. print "change_password error: %s, %s" %(uid ,str(e))
  80. return False
  81. def get_group_member(ldap_to_connect, cn, group_dn):
  82. """
  83. 获取组成员
  84. :param ldap_to_connect: ldap连接对象
  85. :param cn: 组名称
  86. :param group_dn: 组base dn
  87. :return: 组成员列表
  88. """
  89. try:
  90. result_set = ldap_to_connect.search_s(group_dn, ldap.SCOPE_SUBTREE, 'cn=' + cn)
  91. name, attrs = result_set[0]
  92. user_pattern = 'uid=(.*?),.*'
  93. user_list = []
  94. if hasattr(attrs, 'has_key') and attrs.has_key('uniqueMember'):
  95. member_list_dn = attrs['uniqueMember']
  96. for m in member_list_dn:
  97. username = re.findall(user_pattern, m)
  98. if username:
  99. user_list.append(username[0])
  100. return user_list
  101. else:
  102. print "get_group_member error: key not found."
  103. return None
  104. except Exception, e:
  105. print "get_group_member error: ", str(e)
  106. return None
  107. def add_group_member(ldap_to, groupname, group_dn, user_dn, user_list):
  108. """
  109. 添加组成员信息
  110. :param ldap_to: ldap连接对象
  111. :param groupname: ldap组名称
  112. :param group_dn: ldap group base dn
  113. :param user_list: 用户列表 ['1111','2222']
  114. :return: 返回 False/True
  115. """
  116. user_dn_list = []
  117. for user in user_list:
  118. user_dn_list.append('uid=%s,%s' %(user, user_dn))
  119. ldap_to_connect = connect_ldap(ldap_to)
  120. modlist = []
  121. if len(user_dn_list) == 0:
  122. modlist.append((ldap.MOD_REPLACE, 'uniqueMember', ""))
  123. for index in range(len(user_dn_list)):
  124. if index == 0:
  125. modlist.append((ldap.MOD_REPLACE, 'uniqueMember', str(user_dn_list[index])))
  126. else:
  127. modlist.append((ldap.MOD_ADD, 'uniqueMember', str(user_dn_list[index])))
  128. try:
  129. modifyDN = "cn=%s,%s" % (groupname, group_dn)
  130. print(modifyDN)
  131. print(modlist)
  132. ldap_to_connect.modify_s(modifyDN, modlist)
  133. return True
  134. except ldap.LDAPError, e:
  135. print("add_group_member: %s add group memeber failed,reason: %s" % (groupname, str(e)))
  136. return False
  137. def sync(group_name, ldap_from, ldap_to):
  138. """
  139. 同步用户组成员密码
  140. :param group_name: 组名称
  141. :param ldap_from: ldap 来源server
  142. :param ldap_to: ldap 目标server
  143. :return: dict 更新结果
  144. """
  145. ldap_to_connect = connect_ldap(ldap_to)
  146. ldap_from_connect = connect_ldap(ldap_from)
  147. user_list = get_group_member(ldap_to_connect, group_name, ldap_to['group_dn'])
  148. count = 0
  149. for user in user_list:
  150. user_password = get_password(ldap_from_connect, user, ldap_from['user_dn'])
  151. if user_password:
  152. if change_password(ldap_to_connect, user, ldap_to['user_dn'], user_password):
  153. count += 1
  154. print "changed: ", user
  155. ldap_to_connect.unbind_s()
  156. ldap_from_connect.unbind_s()
  157. return {'success': count, 'total': len(user_list)}
  158. if __name__ == '__main__':
  159. # 同步jenkins群组
  160. result = sync("oa-jenkins", PORTAL_LDAP, DEVOPS_LDAP)
  161. print(result)
  162. # 同步gitlab群组
  163. result = sync("oa-gitlab", PORTAL_LDAP, DEVOPS_LDAP)
  164. print(result)
  165. # 同步组成员
  166. #user_list = []
  167. #result = add_group_member(DEVOPS_LDAP, 'oa-jenkins', DEVOPS_LDAP['group_dn'], DEVOPS_LDAP['user_dn'], user_list)
  168. print(result)

python 调用ldap同步密码的更多相关文章

  1. Python实现LDAP用户名密码验证

    网上借鉴了不少东西,下面是python代码,备份后用. 思路,因为每个用户的组都不一样,这样就导致了dn不一致的情况, 据需要先根据用户名获取该用户的dn,然后再bind用户名和密码进行验证. 反正是 ...

  2. day1 python调用模块,密码加密

    import getpass #加密密码 username = input("username:") password = getpass.getpass("passwo ...

  3. python调用ggsci.exe程序

    需求:通过python调用windows server 2008下的ogg同步程序,实现图形化控制. 简单GUI

  4. python调用系统命令popen、system

    python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容.所以说一般我们认为popen ...

  5. 『Python』Python 调用 ZoomEye API 批量获取目标网站IP

    #### 20160712 更新 原API的访问方式是以 HTTP 的方式访问的,根据官网最新文档,现在已经修改成 HTTPS 方式,测试可以正常使用API了. 0x 00 前言 ZoomEye 的 ...

  6. 使用python调用email模块发送邮件附件

    使用python调用email模块实现附件发送 需要模块: import datetime import time import sys import mimetypes import smtplib ...

  7. Python调用Webservice

    使用Python调用webservice 推荐使用 suds包 该包一般在Python2.x   python3各种麻烦 略过 实例 import suds # webservice url url ...

  8. Python全栈 MySQL 数据库(SQL命令大全、MySQL 、Python调用)

    为了梦想与了信仰    开局一张图   主要三个方面: 1.Linux终端命令 2.MySQL语句 3.Python调用   先删库 再跑路.....                         ...

  9. 如何使用Python连接ldap

    如何使用Python连接ldap 好多使用ldap认证的软件都是Python的,比如superset和airflow, 好吧,他们都是airbnb家的.在配置ldap的时候可能会出现认证失败,你不知道 ...

随机推荐

  1. python机器学习的常用算法

    Python机器学习 学习意味着通过学习或经验获得知识或技能.基于此,我们可以定义机器学习(ML)如下 - 它可以被定义为计算机科学领域,更具体地说是人工智能的应用,其为计算机系统提供了学习数据和从经 ...

  2. PHP中静态(static)调用非静态方法详解--调用!!!

    来源:https://www.cnblogs.com/yolo-bean/p/7739265.html 这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么 ...

  3. openssl 查看证书

    查看证书 # 查看KEY信息 > openssl rsa -noout -text -in myserver.key # 查看CSR信息 > openssl req -noout -tex ...

  4. 【三剑客】sed命令

    1. Sed 简介 sed 是Stream Editor(流编辑器)的缩写,是操作.过滤和转换文本内容的强大工具.常用功能有增删改查,过滤,取行.   sed 是一种新型的,非交互式的编辑器. 它能执 ...

  5. SQL语句学习(一)

    这篇文章用来记录再学习SQL语句的过程. 首先,我们从简单的创建表开始.创建表的语法是CREATE TABLE 表名(列1的名字  列1的属性,列2的名字  列2的属性...); 如果希望将某一列作为 ...

  6. [故障解决]图文:windows apache无法启用 端口被占用

    windows apache无法启用 端口被占用 1 XAMPP Error: Apache shutdown unexpectedly 无法启动apache,显示的log为: 2 查了一下端口, 通 ...

  7. Node.js中的express框架,修改内容后自动更新(免重启),express热更新

    个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 以前node中的express框架,每次修改代码之后,都需要重新npm s ...

  8. 跟风微信小程序,生鲜水果店如何借力小程序每天多赚2万块?

    公司旁边的水果店,虽然是一家实体店,但老板有一颗爱玩互联网的心. 老板非常重视线上的营销推广,什么新的线上推广方式都爱尝试一下.公众号大热时做了自己的微信公众号,并且有自己的微信商城,不过线上的销售一 ...

  9. 一只简单的网络爬虫(基于linux C/C++)————浅谈并发(IO复用)模型

    Linux常用的并发模型 Linux 下设计并发网络程序,有典型的 Apache 模型( Process Per Connection ,简称 PPC ), TPC ( Thread Per Conn ...

  10. Python网络数据采集- 创建爬虫

    1. 初见网络爬虫 1.1 网络连接 输出某个网页的全部 HTML 代码. urllib 是 Python 的标准库(就是说你不用额外安装就可以运行这个例子),包含了从网络请求数据,处理 cookie ...