• Bash openldap同步AD组织数据


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

    整体思路如下:

    • 从ad导出所有的数据,然后进行参数替换以及处理,处理后的文件称为A;
    • 从openldap导出所有的数据,然后进行参数替换以及处理,处理后的文件称为B;
    • 利用A,B进行全文对比,然后将差集和增量进行添加或删除(需要注意的是,这里的需求是openldap的数据完全跟AD保持一致,即便openldap有比ad多出的数据,也会被删除掉,除非不在 同步的ou下(即修改下面的 LDAP_BASE_DN))
    #!/bin/bash
    # 预定义参数
    AD_DOMAIN=""
    AD_ADMIN_DN="CN=,OU=XXX,OU=XXX,DC=XXX,DC=XXX,DC=XXX"
    AD_ADMIN_PWD=""
    AD_BASE_DN="DC=XXX,DC=XXX,DC=XXX"
    LDAP_DOMAIN=""
    LDAP_ADMIN_DN="cn=Manager,dc=XXX,dc=XXX,dc=XXX"
    LDAP_ADMIN_PWD=""
    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.ldif
         while read LINE; do
           # 如果dn中包含 / 字符,则进行转义
           if [[ "$LINE" == *"/"* ]]; then
             LINE="${LINE//\//\\/}"
           fi
           tmp_ou=$(echo $LINE | grep -o 'OU=[^,]*' | head -n 1)
           sed -i "s#^OU=#OU: #g" /opt/tmp_add_group.ldif
           sed -i "/$LINE/a"$tmp_ou /opt/tmp_add_group.ldif
         done < /opt/tmp_add_group.ldif
         sed -i "/^OU:/i\objectClass: top" /opt/tmp_add_group.ldif
         sed -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; do
      if 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
  • 相关阅读:
    计算机毕业设计Java重工教师职称管理系统(源码+系统+mysql数据库+lw文档)
    FPGA解析B码----连载2
    Qt应用开发(基础篇)——树结构视图 QTreeView
    遥感云计算的一个拐点
    sklearn机器学习——day03
    异或和大小比较类问题——抓住最高位:CF1863F
    机器学习 | 基于随机森林的可解释性机器学习
    基于ClickHouse解决活动海量数据问题
    053-第三代软件开发-元对象系统
    Unity接入OneStore内购
  • 原文地址:https://blog.csdn.net/zz18435842675/article/details/134449437