遵义花果园网站建设,创建一个网站多少钱,河北招投标公共服务平台,南昌百度推广联系方式将AD的ou同步到openldap#xff08;可支持全量同步和增量同步#xff09;
整体思路如下#xff1a;
从ad导出所有的数据#xff0c;然后进行参数替换以及处理#xff0c;处理后的文件称为A#xff1b;从openldap导出所有的数据#xff0c;然后进行参数替换以及处理可支持全量同步和增量同步
整体思路如下
从ad导出所有的数据然后进行参数替换以及处理处理后的文件称为A从openldap导出所有的数据然后进行参数替换以及处理处理后的文件称为B利用A,B进行全文对比然后将差集和增量进行添加或删除需要注意的是这里的需求是openldap的数据完全跟AD保持一致即便openldap有比ad多出的数据也会被删除掉除非不在 同步的ou下即修改下面的 LDAP_BASE_DN
#!/bin/bash
# 预定义参数
AD_DOMAINYour ADs domain
AD_ADMIN_DNCNAdmin account name,OUXXX,OUXXX,DCXXX,DCXXX,DCXXX
AD_ADMIN_PWDYour admin password
AD_BASE_DNDCXXX,DCXXX,DCXXX
LDAP_DOMAINYour OpenLDAPs domain
LDAP_ADMIN_DNcnManager,dcXXX,dcXXX,dcXXX
LDAP_ADMIN_PWDYour admin password
LDAP_BASE_DNOUxxx,DCxxx,DCxxx# 先从AD上获取OU组织信息并保存成ldif文件
/opt/bitnami/openldap/bin/ldapsearch -x -H ldap://${AD_DOMAIN} ((objectClasstop)(objectClassorganizationalUnit)) dn objectClass ou -D ${AD_ADMIN_DN} -w ${AD_ADMIN_PWD} -b ${AD_BASE_DN} -L | perl -MMIME::Base64 -MEncodedecode -n -00 -e s/\n //g;s/(?:: )(\S)/decode(UTF-8,decode_base64($1))/eg;print /opt/tmp_query_adgroup.ldif# 全文将 ad的域dcaaa,dccom) 替换为openldap的域dcbbb,dcnet
sed -i s#DCaaa,DCcom#DCbbb,DCnet#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} ((objectClasstop)(objectClassorganizationalUnit)) dn objectClass ou -D ${LDAP_ADMIN_DN} -w ${LDAP_ADMIN_PWD} -b ${LDAP_BASE_DN} -L | perl -MMIME::Base64 -MEncodedecode -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
# 将dcou大写
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 21
done /opt/tmp_del_group.ldif