python 调用ldap同步密码
- windows + python2.7 安装 python-ldap
https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap
2.python 同步密码
# encoding: utf-8
"""
Created by Jeff Liu on 2019/12/2
"""
import ldap
import re
PORTAL_LDAP = {
'bind_dn': '',
'bind_pass': '',
'ldap_server': '',
'port':"",
'user_dn': '',
'group_dn': ''
}
DEVOPS_LDAP = {
'bind_dn': '',
'bind_pass': '',
'ldap_server': '',
'port':"",
'user_dn': '',
'group_dn': ''
}
def connect_ldap(my_ldap):
"""
建立ldap连接
:param my_ldap: ldap连接信息
:return: 返回ldap连接对象
"""
ip = my_ldap['ldap_server']
port = my_ldap['port']
bind_dn = my_ldap['bind_dn']
bind_pass = my_ldap['bind_pass']
# 如果是ldaps, 需要指定CA cert file
# ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, "/path/to/ldaps.cert.file")
# 如果是self-signed cert, 加上这行
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
# 初始化LDAP连接
ldap_connect = ldap.initialize('ldap://' + ip + ':' + port)
ldap_connect.set_option(ldap.OPT_REFERRALS, 0)
ldap_connect.protocol_version = ldap.VERSION3
ldap_connect.simple_bind_s(bind_dn, bind_pass)
print("ldap: {} is connected.".format(ip))
return ldap_connect
def get_password(ldap_connect, uid, user_dn):
"""
获取用户密码(加密)
:param ldap_connect: ldap连接对象
:param uid: 用户账号
:param user_dn: 用户base dn
:return: 用户密码信息
"""
try:
result_set = ldap_connect.search_s(user_dn, ldap.SCOPE_SUBTREE, 'uid=' + uid)
name, attrs = result_set[0]
if hasattr(attrs, 'has_key') and attrs.has_key('uid'):
userPassword = attrs['userPassword'][0]
return userPassword
else:
print "get_password error: %s not found." %uid
return None
except Exception, e:
print "get_password error: uid=%s, %s" %(uid, str(e))
return None
def change_password(ldap_to_connect, uid, user_dn, new_password):
"""
修改用户密码
:param ldap_to_connect: ldap连接对象
:param uid: 用户账号
:param user_dn: 用户base dn
:param new_password: 新密码
:return: 用户密码
"""
try:
dn = 'uid=%s, %s' %(uid, user_dn)
modlist = [(ldap.MOD_REPLACE, 'userPassword', new_password)]
ldap_to_connect.modify_s(dn, modlist)
return True
except Exception,e:
print "change_password error: %s, %s" %(uid ,str(e))
return False
def get_group_member(ldap_to_connect, cn, group_dn):
"""
获取组成员
:param ldap_to_connect: ldap连接对象
:param cn: 组名称
:param group_dn: 组base dn
:return: 组成员列表
"""
try:
result_set = ldap_to_connect.search_s(group_dn, ldap.SCOPE_SUBTREE, 'cn=' + cn)
name, attrs = result_set[0]
user_pattern = 'uid=(.*?),.*'
user_list = []
if hasattr(attrs, 'has_key') and attrs.has_key('uniqueMember'):
member_list_dn = attrs['uniqueMember']
for m in member_list_dn:
username = re.findall(user_pattern, m)
if username:
user_list.append(username[0])
return user_list
else:
print "get_group_member error: key not found."
return None
except Exception, e:
print "get_group_member error: ", str(e)
return None
def add_group_member(ldap_to, groupname, group_dn, user_dn, user_list):
"""
添加组成员信息
:param ldap_to: ldap连接对象
:param groupname: ldap组名称
:param group_dn: ldap group base dn
:param user_list: 用户列表 ['1111','2222']
:return: 返回 False/True
"""
user_dn_list = []
for user in user_list:
user_dn_list.append('uid=%s,%s' %(user, user_dn))
ldap_to_connect = connect_ldap(ldap_to)
modlist = []
if len(user_dn_list) == 0:
modlist.append((ldap.MOD_REPLACE, 'uniqueMember', ""))
for index in range(len(user_dn_list)):
if index == 0:
modlist.append((ldap.MOD_REPLACE, 'uniqueMember', str(user_dn_list[index])))
else:
modlist.append((ldap.MOD_ADD, 'uniqueMember', str(user_dn_list[index])))
try:
modifyDN = "cn=%s,%s" % (groupname, group_dn)
print(modifyDN)
print(modlist)
ldap_to_connect.modify_s(modifyDN, modlist)
return True
except ldap.LDAPError, e:
print("add_group_member: %s add group memeber failed,reason: %s" % (groupname, str(e)))
return False
def sync(group_name, ldap_from, ldap_to):
"""
同步用户组成员密码
:param group_name: 组名称
:param ldap_from: ldap 来源server
:param ldap_to: ldap 目标server
:return: dict 更新结果
"""
ldap_to_connect = connect_ldap(ldap_to)
ldap_from_connect = connect_ldap(ldap_from)
user_list = get_group_member(ldap_to_connect, group_name, ldap_to['group_dn'])
count = 0
for user in user_list:
user_password = get_password(ldap_from_connect, user, ldap_from['user_dn'])
if user_password:
if change_password(ldap_to_connect, user, ldap_to['user_dn'], user_password):
count += 1
print "changed: ", user
ldap_to_connect.unbind_s()
ldap_from_connect.unbind_s()
return {'success': count, 'total': len(user_list)}
if __name__ == '__main__':
# 同步jenkins群组
result = sync("oa-jenkins", PORTAL_LDAP, DEVOPS_LDAP)
print(result)
# 同步gitlab群组
result = sync("oa-gitlab", PORTAL_LDAP, DEVOPS_LDAP)
print(result)
# 同步组成员
#user_list = []
#result = add_group_member(DEVOPS_LDAP, 'oa-jenkins', DEVOPS_LDAP['group_dn'], DEVOPS_LDAP['user_dn'], user_list)
print(result)
python 调用ldap同步密码的更多相关文章
- Python实现LDAP用户名密码验证
网上借鉴了不少东西,下面是python代码,备份后用. 思路,因为每个用户的组都不一样,这样就导致了dn不一致的情况, 据需要先根据用户名获取该用户的dn,然后再bind用户名和密码进行验证. 反正是 ...
- day1 python调用模块,密码加密
import getpass #加密密码 username = input("username:") password = getpass.getpass("passwo ...
- python调用ggsci.exe程序
需求:通过python调用windows server 2008下的ogg同步程序,实现图形化控制. 简单GUI
- python调用系统命令popen、system
python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容.所以说一般我们认为popen ...
- 『Python』Python 调用 ZoomEye API 批量获取目标网站IP
#### 20160712 更新 原API的访问方式是以 HTTP 的方式访问的,根据官网最新文档,现在已经修改成 HTTPS 方式,测试可以正常使用API了. 0x 00 前言 ZoomEye 的 ...
- 使用python调用email模块发送邮件附件
使用python调用email模块实现附件发送 需要模块: import datetime import time import sys import mimetypes import smtplib ...
- Python调用Webservice
使用Python调用webservice 推荐使用 suds包 该包一般在Python2.x python3各种麻烦 略过 实例 import suds # webservice url url ...
- Python全栈 MySQL 数据库(SQL命令大全、MySQL 、Python调用)
为了梦想与了信仰 开局一张图 主要三个方面: 1.Linux终端命令 2.MySQL语句 3.Python调用 先删库 再跑路..... ...
- 如何使用Python连接ldap
如何使用Python连接ldap 好多使用ldap认证的软件都是Python的,比如superset和airflow, 好吧,他们都是airbnb家的.在配置ldap的时候可能会出现认证失败,你不知道 ...
随机推荐
- 即时通信WebSocket 和Socket.IO
WebSocket HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯. 在2008年诞生,2011年成为国际标准. 现在基本所有浏览器都已经支持了. We ...
- JDBC 中的事务和批处理 batch
JDBC事务处理: 事务处理一般在事务开始前把事务提交设置为false 所有DML语句执行完成后提交事务 demo: package com.xzlf.jdbc; import java.sql.Co ...
- GitHub 热点速览 Vol.17:在?各家视频会员要不要?
作者:HelloGitHub-小鱼干 摘要:经济实用,用作上周的 GitHub 热点的横批再合适不过.先不说 GitHub Trending 上不止一个的会员共享项目,免你找好友刷脸要会员,这项目实在 ...
- 曹工杂谈--只用一个命令,centos系统里装了啥软件,啥时候装的,全都清清楚楚
前言 一直以来,对linux的掌握就是半桶水的状态,经常yum装个东西,结果依赖一堆东西:然后再用源码装个东西,只知道make.make install,背后干了啥也不清楚了,卸载也不方便. 这几天工 ...
- 5、flink常见函数使用及自定义转换函数
代码地址:https://gitee.com/nltxwz_xxd/abc_bigdata 一.flink编程方法 获取执行环境(execution environment) 加载/创建初始数据集 对 ...
- view-controller
有的时候我们只想根据一个请求地址跳转到一个页面中,中间并没有任何的处理流程,这个时候创建一个 Controller 类再编写方法来跳转就显得很繁琐.这个时候我们就可以使用 view-controlle ...
- Ubuntu 设置 log 级别
Linux环境下使用rsyslog管理日志 rsyslog linux运维 linux 22.7k 次阅读 · 读完需要 22 分钟 在 Linux 系统中,日志文件记录了系统中包括内核. ...
- [Inno Setup] Do not show application version in “Program and Features” control panel
Set AppVersion empty. But, then you have to set the AppVerName. Depending on your needs either set i ...
- linux sort 命令实用手册
Linux 中的sort 命令是一个很实用的工具,用于对文本内容以行为单位进行ASCII 码排序,默认按照升序进行排序(当然也可以按照降序). sort 命令的格式如下: sort `参数` `文件名 ...
- oracle获取表字段及表注释的相关操作
一.获取表字段: select * from user_tab_columns where Table_Name='用户表' user_tab_columns 为当前用户的columns,除此之外还有 ...