当前位置: 首页 > news >正文

Bash openldap同步AD组织数据

将AD的ou同步到openldap(可支持全量同步和增量同步)

整体思路如下:

  • 从ad导出所有的数据,然后进行参数替换以及处理,处理后的文件称为A;
  • 从openldap导出所有的数据,然后进行参数替换以及处理,处理后的文件称为B;
  • 利用A,B进行全文对比,然后将差集和增量进行添加或删除(需要注意的是,这里的需求是openldap的数据完全跟AD保持一致,即便openldap有比ad多出的数据,也会被删除掉,除非不在 同步的ou下(即修改下面的 LDAP_BASE_DN))
#!/bin/bash
# 预定义参数
AD_DOMAIN="<Your AD's domain>"
AD_ADMIN_DN="CN=<Admin account name>,OU=XXX,OU=XXX,DC=XXX,DC=XXX,DC=XXX"
AD_ADMIN_PWD="<Your admin password>"
AD_BASE_DN="DC=XXX,DC=XXX,DC=XXX"
LDAP_DOMAIN="<Your OpenLDAP's domain>"
LDAP_ADMIN_DN="cn=Manager,dc=XXX,dc=XXX,dc=XXX"
LDAP_ADMIN_PWD="<Your admin password>"
LDAP_BASE_DN="OU=xxx,DC=xxx,DC=xxx"# 先从AD上获取OU组织信息,并保存成ldif文件
/opt/bitnami/openldap/bin/ldapsearch -x -H ldap://${AD_DOMAIN} "(&(objectClass=top)(objectClass=organizationalUnit))" dn objectClass ou -D "${AD_ADMIN_DN}" -w "${AD_ADMIN_PWD}" -b "${AD_BASE_DN}" -L | perl -MMIME::Base64 -MEncode=decode -n -00 -e 's/\n +//g;s/(?<=:: )(\S+)/decode("UTF-8",decode_base64($1))/eg;print' > /opt/tmp_query_adgroup.ldif# 全文将 ad的域(dc=aaa,dc=com) 替换为openldap的域(dc=bbb,dc=net)
sed -i 's#DC=aaa,DC=com#DC=bbb,DC=net#g' /opt/tmp_query_adgroup.ldif
# 全文将 :: 替换为 :
sed -i 's#::#:#g' /opt/tmp_query_adgroup.ldif
# 去掉以#开头的行
sed '/^#/d' /opt/tmp_query_adgroup.ldif > /opt/tmp_handle_adgroup.ldif# 读取OPENLDAP上所有的ou
/opt/bitnami/openldap/bin/ldapsearch -x -H ldap://${LDAP_DOMAIN} "(&(objectClass=top)(objectClass=organizationalUnit))" dn objectClass ou -D "${LDAP_ADMIN_DN}" -w "${LDAP_ADMIN_PWD}" -b "${LDAP_BASE_DN}" -L | perl -MMIME::Base64 -MEncode=decode -n -00 -e 's/\n +//g;s/(?<=:: )(\S+)/decode("UTF-8",decode_base64($1))/eg;print' > /opt/tmp_query_opgroup.ldif
# 全文将 :: 替换为 :
sed -i 's#::#:#g' /opt/tmp_query_opgroup.ldif
sed '/^#/d' /opt/tmp_query_opgroup.ldif > /opt/tmp_handle_opgroup.ldif
# 将dc,ou大写
sed -i 's#dc=#DC=#g' /opt/tmp_handle_opgroup.ldif
sed -i 's#ou=#OU=#g' /opt/tmp_handle_opgroup.ldif#==========================================================全文比对==========================================================#openldap比ad多出来的ou
grep -vxFf /opt/tmp_handle_adgroup.ldif /opt/tmp_handle_opgroup.ldif > /opt/tmp_del_group.ldif
sed -i "/^ou:/d" /opt/tmp_del_group.ldif
# 去掉dn
sed -i "s#dn: ##g" /opt/tmp_del_group.ldif# opldap比ad少的ou
grep -vxFf /opt/tmp_handle_opgroup.ldif /opt/tmp_handle_adgroup.ldif > /opt/tmp_add_group.ldif
# 首次全量添加的时候,不需要添加top、organizationalUnit 属性
if ! grep -q "objectClass: top"  /opt/tmp_add_group.ldif ; then# 只保留dn(因为dn是唯一的)sed -i "/^ou:/d" /opt/tmp_add_group.ldifwhile read LINE; do# 如果dn中包含 / 字符,则进行转义if [[ "$LINE" == *"/"* ]]; thenLINE="${LINE//\//\\/}"fitmp_ou=$(echo $LINE | grep -o 'OU=[^,]*' | head -n 1)sed -i "s#^OU=#OU: #g" /opt/tmp_add_group.ldifsed -i "/$LINE/a"$tmp_ou /opt/tmp_add_group.ldifdone < /opt/tmp_add_group.ldifsed -i "/^OU:/i\objectClass: top" /opt/tmp_add_group.ldifsed -i "/^OU:/i\objectClass: organizationalUnit" /opt/tmp_add_group.ldif
fi
# changetype: add必须位于第二行,也就是dn下方
sed -i "/^dn:/a\changetype: add" /opt/tmp_add_group.ldif# 添加换行符
sed -i "/^OU:/a\\\n" /opt/tmp_add_group.ldif
sed -i "/^ou:/a\\\n" /opt/tmp_add_group.ldif#====================================对数据进行增加或者删除====================================# openldap添加缺少ad的ou
/opt/bitnami/openldap/bin/ldapmodify -x -H ldapi:/// -c -w "${LDAP_ADMIN_PWD}" -D "${LDAP_ADMIN_DN}" -f  /opt/tmp_add_group.ldif >& /opt/tmp_add_group_rec.log
# 防止第一次执行不成功(因为ou是无序的)
while read LINE; doif grep -q "ldap_add: No such object (32)" /opt/tmp_add_group_rec.log ; then/opt/bitnami/openldap/bin/ldapmodify -x -H ldapi:/// -c -w "${LDAP_ADMIN_PWD}" -D "${LDAP_ADMIN_DN}" -f  /opt/tmp_add_group.ldif >& /opt/tmp_add_group_rec.log$(sleep 1s)fi
done < /opt/tmp_add_group_rec.log# 最后一步执行 openldap删除多出来的ou
while read LINE; do/opt/bitnami/openldap/bin/ldapdelete  -x -H ldapi:/// -c -w "${LDAP_ADMIN_PWD}" -D "${LDAP_ADMIN_DN}" -r ${LINE} > /dev/null 2>&1
done < /opt/tmp_del_group.ldif

相关文章:

Bash openldap同步AD组织数据

将AD的ou同步到openldap&#xff08;可支持全量同步和增量同步&#xff09; 整体思路如下&#xff1a; 从ad导出所有的数据&#xff0c;然后进行参数替换以及处理&#xff0c;处理后的文件称为A&#xff1b;从openldap导出所有的数据&#xff0c;然后进行参数替换以及处理&am…...

C#WPF文本转语音实例

本文介绍C#WPF文本转语音实例 实现方法:使用类库(SpeechSynthesizer )实现的。 一、首先是安装程序包。 二、创建项目 需要添加引用using System.Speech.Synthesis; UI界面 <Windowx:Class="TextToSpeechDemo.MainWindow"xmlns="http://schemas.micr…...

08-流媒体-RTMP拉流

整体方案&#xff1a; 采集端&#xff1a;摄像头采集&#xff08;YUV&#xff09;->编码&#xff08;YUV转H264&#xff09;->写封装&#xff08;&#xff28;264转FLV&#xff09;->RTMP推流 客户端&#xff1a;RTMP拉流->解封装&#xff08;FLV转H264&#xff09…...

一键免费去除视频水印和字幕的AI工具

最近有学员经常让我分享好用的智能抹除视频水印字幕AI工具&#xff0c;今天就给大家分享一个我经常用到的这款工具——腾讯智影&#xff0c;这个平台提供的智能抹除功能&#xff0c;借助这个工具我们可以将视频中不需要的字幕或者水印删除掉。 不过这款工具每天有三次免费次数…...

实验六:Android的网络编程基础

实验六&#xff1a;Android 的网络编程基础 6.1 实验目的 本次实验的目的是让大家熟悉 Android 开发中的如何获取天气预报&#xff0c;包括了 解和熟悉 WebView、WebService 使用、网络编程事件处理等内容。 6.2 实验要求 熟悉和掌握 WebView 使用 了解 Android 的网络编程…...

09-流媒体-FLV解复用

整体方案&#xff1a; 采集端&#xff1a;摄像头采集&#xff08;YUV&#xff09;->编码&#xff08;YUV转H264&#xff09;->写封装&#xff08;&#xff28;264转FLV&#xff09;->RTMP推流 客户端&#xff1a;RTMP拉流->解封装&#xff08;FLV转H264&#xff09…...

信息的浏览

万维网(WWW)是目前Internet上最流行的一种服务&#xff0c;它是建立在Internet上的多媒体集合信息系统。它利用超媒体的信息获取技术&#xff0c;通过一种超文本的表达方式&#xff0c;将所有WWW上的信息连接在一起。我们使用浏览器浏览网上的信息。 ▶浏览器 浏览器是指可以…...

vue directive自定义指令实现弹窗可拖动

vue2 创建一个js文件 // draggable.js export default {// 定义 Vue 插件install(Vue) {Vue.directive(draggable, { // 全局指令名为 v-draggableinserted(el) {el.onmousedown function (ev) {// 获取鼠标按下时的偏移量&#xff08;鼠标位置 - 元素位置&#xff09;const…...

07-流媒体-RTMP推流

整体方案&#xff1a; 采集端&#xff1a;摄像头采集&#xff08;YUV&#xff09;->编码&#xff08;YUV转H264&#xff09;->写封装&#xff08;&#xff28;264转FLV&#xff09;->RTMP推流 客户端&#xff1a;RTMP拉流->解封装&#xff08;FLV转H264&#xff09…...

Neo4j安装(Docker中安装Neo4j)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

面试求职者

顾x文 SQLite3数据的使用实现了多线程UDP数据收发功能Qt多线程的同步和异步熟悉GDB的调试了解Mysql的性能优化熟悉常见算法&#xff1a;快速排序、希尔排序、归并排序基于Nginx C Mysql Python ICE开发熟练Boost库负责搭建后台服务端&#xff0c;使用Nginx展示前端界面&am…...

Java NIO 详解

一、NIO简介 NIO 是 Java SE 1.4 引入的一组新的 I/O 相关的 API&#xff0c;它提供了非阻塞式 I/O、选择器、通道、缓冲区等新的概念和机制。相比与传统的 I/O 多出的 N 不是单纯的 New&#xff0c;更多的是代表了 Non-blocking 非阻塞&#xff0c;NIO具有更高的并发性、可扩…...

css设置下划线

css中设置下划线的方法 在CSS中可以使用text-decoration属性或border-bottom属性来给字体设置下划线样式。 1、使用text-decoration:underline;设置下划线样式 CSS的text-decoration属性用于指定添加到文本的修饰&#xff0c;其underline属性值可以定义文本下的一条线。 语…...

【献给过去的自己】栈实现计算器(C语言)

背景 记得在刚学C语言时&#xff0c;写了一篇栈实现计算器-CSDN博客文章。偶然间看到了文章的阅读量以及评论&#xff0c;居然有1.7w的展现和多条博友的点评&#xff0c;反馈。 现在回过头来看&#xff0c;的确有许多不严谨的地方&#xff0c;毕竟当时分享文章时&#xff0c;还…...

如何利用ChatGPT撰写学术论文?

在阅读全文前请注意&#xff0c;本文是利用ChatGPT“辅助完成”而不是“帮写”学术论文&#xff0c;请一定要注意学术规范&#xff01; 本文我将介绍如何使用清晰准确的“指令”让ChatGPT帮助我们在论文写作上提高效率&#xff0c;希望通过本文的指导&#xff0c;读者能够充分…...

【PG】PostgreSQL高可用方案repmgr管理之配置文件

1 配置文件 1.1 配置文件格式 repmgr.conf是一个纯文本文件&#xff0c;每行包含一个参数/值组合。 空格是无关紧要的&#xff08;除了在带引号的参数值内&#xff09;&#xff0c;并且空行将被忽略。#将该行的其余部分指定为注释。不是简单标识符或数字的参数值应该用单引号…...

labelme自动标注工具

可以实现多图中相同目标的追踪&#xff0c;自动标注目标位置&#xff0c;速度极快&#xff0c;有需要评论...

【C++学习手札】模拟实现vector

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;くちなしの言葉—みゆな 0:37━━━━━━️&#x1f49f;──────── 5:28 &#x1f504; ◀️ ⏸ ▶️ ☰…...

Python将图片按照表格形式排列

图片按照表格的形式排列&#xff0c;可以使用图像处理库Pillow来实现 事例代码 from PIL import Image, ImageDraw# 创建一个画布&#xff0c;用来存放排列后的图片 canvas Image.new(RGB, (800, 600), white)# 读取图片 im1 Image.open(image1.jpg) im2 Image.open(image…...

Linux 简要命令记录

1、设置时区&#xff1a; #设为上海&#xff1a; timedatectl set-timezone Asia/Shanghai #搜索特定时区 timedatectl list-timezone2、修改时间&#xff1a; #设定系统时间 date -s "2023-11-16 22:30:00" #同步写入BIOS hwclock -w3、fdisk分区 rootheihei:~# …...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...