66
77#### 编辑组文件
88
9+ import Tabs from '@theme/Tabs ';
10+ import TabItem from '@theme/TabItem ';
11+
12+ <Tabs >
13+ <TabItem value =" 增加ou " label =" 增加ou " default >
14+
915``` shell
10- cat > groups.txt << EOF
16+ cat > ous.txt << EOF
17+ ou_name1
18+ ou_name2
19+ ou_name3
20+ EOF
21+ ```
22+
23+ </TabItem >
24+ <TabItem value =" 增加cn " label =" 增加cn " >
25+
26+ ``` bash
27+ cat > cns.txt << EOF
1128go
1229java
1330python
14- php
15- c
16- c++
17- c#
1831EOF
1932```
2033
34+ </TabItem >
35+
36+ <TabItem value =" 删除ou或cn " label =" 删除ou或cn " >
2137
38+ 每行一个条目
2239
40+ ``` shell
41+ cat > entries.txt << EOF
42+ cn:devops
43+ ou:People
44+ cn:admins
45+ ou:Groups
46+ EOF
47+ ```
48+
49+ </TabItem >
50+
51+ </Tabs >
2352
2453
25- #### 批量增加组
2654
27- import Tabs from '@theme/Tabs ';
28- import TabItem from '@theme/TabItem ';
55+
56+
57+ #### 批量增加组
2958
3059<Tabs >
3160 <TabItem value =" ou " label =" ou " default >
@@ -48,16 +77,14 @@ import TabItem from '@theme/TabItem';
4877
4978- 基本配置文件
5079
51- :::tip 说明
52-
5380 | 参数 | 说明 |
5481 | --------------------------------- | ----------------------------------------------- |
5582 | ` dn: ou=People,dc=example,dc=com ` | 完整路径(OU=People 在 dc=example,dc=com 下面) |
5683 | ` objectClass: top ` | 所有结构类(structural objectClass)的 ** 基类** |
5784 | ` objectClass: organizationalUnit ` | 表示这是一个 OU |
5885 | ` ou: People ` | OU 的名字 |
5986
60- :::
87+
6188
6289 ``` shell
6390 dn: ou=People,dc=example,dc=com
@@ -75,13 +102,13 @@ cat > add-ous.sh << 'AAA'
75102# ========================
76103# 配置部分
77104# ========================
78- BASE_DN="dc=ops,dc=com" # LDAP 根
79- BIND_DN="cn=admin,dc=ops,dc=com" # 管理员账号
80- BIND_PWD="admin" # 管理员密码
81- LDAP_HOST="localhost"
82- LDAP_HOST_PORT="389"
105+ BASE_DN="dc=ops,dc=com" # LDAP 根
106+ BIND_DN="cn=admin,dc=ops,dc=com" # 管理员账号
107+ BIND_PWD="admin" # 管理员密码
108+ LDAP_HOST="localhost" # LDAP 域名/IP
109+ LDAP_HOST_PORT="389" # LDAP 端口
83110
84- OU_FILE="ous.txt" # OU 文件,每行一个 OU 名
111+ OU_FILE="ous.txt" # OU 文件,每行一个 OU 名
85112
86113# ========================
87114# DN 转义函数(RFC4514)
155182
156183- 基本配置文件
157184
158- :::tip 说明
159-
160185 | 参数 | 说明 |
161186 | ------------------------------------------- | ------------------------------------------------------ |
162187 | ` dn: cn=devops,ou=Groups,dc=example,dc=com ` | 这条记录在 LDAP 树中的绝对路径 |
165190 | ` cn: devops ` | ** POSIX 组对象** 的名字, ** POSIX 组** 必须有 ` cn ` 属性 |
166191 | ` gidNumber: 1001 ` | 组id号 |
167192
168- :::
193+
169194
170195 ``` shell
171196 dn: cn=devops,ou=Groups,dc=example,dc=com
@@ -186,14 +211,16 @@ cat > add-cns.sh << 'AAA'
186211# ========================
187212# 配置部分
188213# ========================
189- BASE_DN="dc=ops,dc=com" # LDAP 根
190- BIND_DN="cn=admin,dc=ops,dc=com" # 管理员账号
191- BIND_PWD="admin" # 管理员密码
192- GID_START=1000 # 起始 GID
214+ BASE_DN="dc=ops,dc=com" # LDAP 根
215+ OU="ou_name1" # 目标 OU 名
216+ OU_DN="ou=${OU},${BASE_DN}" # 指定组要放的 OU
217+ BIND_DN="cn=admin,dc=ops,dc=com" # 管理员账号
218+ BIND_PWD="admin" # 管理员密码
219+ GID_START=1000 # 起始 GID
193220LDAP_HOST="localhost"
194221LDAP_HOST_PORT="389"
195222
196- GROUP_FILE="groups .txt" # 组名文件,每行一个组
223+ GROUP_FILE="cns .txt"
197224
198225# ========================
199226# DN 转义函数(RFC4514)
@@ -219,18 +246,17 @@ CURRENT_GID=$GID_START
219246
220247while read -r GROUPNAME
221248do
222- # 跳过空行或注释
223- [[ -z "$GROUPNAME" || "$GROUPNAME" =~ ^# ]] && continue
249+ [[ -z "$GROUPNAME" || "$GROUPNAME" =~ ^# ]] && continue # 跳过空行/注释
224250
225251 ESCAPED_GROUPNAME=$(escape_dn "$GROUPNAME")
226- DN="cn=${ESCAPED_GROUPNAME},${BASE_DN }"
252+ DN="cn=${ESCAPED_GROUPNAME},${OU_DN }"
227253
228- # 检查是否已存在
229- if ldapsearch -x -H ldap://${LDAP_HOST}:${LDAP_HOST_PORT} -D "${BIND_DN}" -w "${BIND_PWD}" -b "${DN}" cn | grep -q "^cn:"; then
254+ if ldapsearch -x -H ldap://${LDAP_HOST}:${LDAP_HOST_PORT} \
255+ -D "${BIND_DN}" -w "${BIND_PWD}" -b "${DN}" cn | grep -q "^cn:"; then
230256 echo "[$GROUPNAME] already exists, skip."
231257 else
232- # 创建组
233- ldapadd -x -H ldap://${LDAP_HOST}:${LDAP_HOST_PORT} -D "${BIND_DN}" -w "${BIND_PWD}" <<EOF
258+ ldapadd -x -H ldap://${LDAP_HOST}:${LDAP_HOST_PORT} \
259+ -D "${BIND_DN}" -w "${BIND_PWD}" <<EOF
234260dn: ${DN}
235261objectClass: top
236262objectClass: posixGroup
246272
247273 CURRENT_GID=$((CURRENT_GID+1))
248274done < "$GROUP_FILE"
275+
249276AAA
250277```
251278
@@ -257,19 +284,19 @@ AAA
257284#### 批量删除组
258285
259286``` shell
260- cat > delete-groups .sh << 'EOF '
287+ cat > delete-entries .sh << 'EOF '
261288#!/bin/bash
262289
263290# ========================
264291# 配置部分
265292# ========================
266- BASE_DN="dc=ops,dc=com" # LDAP 根
267- BIND_DN="cn=admin,dc=ops,dc=com" # 管理员账号
268- BIND_PWD="admin" # 管理员密码
293+ BASE_DN="dc=ops,dc=com" # LDAP 根
294+ BIND_DN="cn=admin,dc=ops,dc=com" # 管理员账号
295+ BIND_PWD="admin" # 管理员密码
269296LDAP_HOST="localhost"
270297LDAP_HOST_PORT="389"
271298
272- GROUP_FILE="groups .txt" # 待删除的组名文件,每行一个组
299+ ENTRY_FILE="entries .txt" # 待删除条目文件,每行一个 cn:xxx 或 ou:xxx
273300
274301# ========================
275302# DN 转义函数(RFC4514)
@@ -289,40 +316,39 @@ escape_dn() {
289316}
290317
291318# ========================
292- # 批量删除组
319+ # 批量删除条目
293320# ========================
294- while read -r GROUPNAME
321+ while read -r LINE
295322do
296323 # 跳过空行或注释
297- if [[ -z "$GROUPNAME" || "$GROUPNAME" =~ ^# ]]; then
298- continue
299- fi
324+ [[ -z "$LINE" || "$LINE" =~ ^# ]] && continue
300325
301- ESCAPED_GROUPNAME=$(escape_dn "$GROUPNAME")
302- DN="cn=${ESCAPED_GROUPNAME},${BASE_DN}"
326+ TYPE="${LINE%%:*}"
327+ NAME="${LINE#*:}"
328+ NAME="${NAME#"${NAME%%[![:space:]]*}"}" # 去掉前导空格
329+ ESCAPED_NAME=$(escape_dn "$NAME")
330+ DN="${TYPE}=${ESCAPED_NAME},${BASE_DN}"
303331
304- # 检查组是否存在
305- if ldapsearch -x -H ldap://${LDAP_HOST}:${LDAP_HOST_PORT} -D "${BIND_DN}" -w "${BIND_PWD}" -b "${DN}" cn | grep -q "^cn :"; then
332+ # 检查条目是否存在
333+ if ldapsearch -x -H ldap://${LDAP_HOST}:${LDAP_HOST_PORT} -D "${BIND_DN}" -w "${BIND_PWD}" -b "${DN}" "${TYPE}" | grep -q "^${TYPE} :"; then
306334 ldapdelete -x -H ldap://${LDAP_HOST}:${LDAP_HOST_PORT} -D "${BIND_DN}" -w "${BIND_PWD}" "${DN}"
307335 if [ $? -eq 0 ]; then
308- echo "[$GROUPNAME ] deleted successfully."
336+ echo "[$TYPE:$NAME ] deleted successfully."
309337 else
310- echo "[$GROUPNAME ] failed to delete!"
338+ echo "[$TYPE:$NAME ] failed to delete!"
311339 fi
312340 else
313- echo "[$GROUPNAME ] does not exist, skip."
341+ echo "[$TYPE:$NAME ] does not exist, skip."
314342 fi
315343
316- done < "$GROUP_FILE "
344+ done < "$ENTRY_FILE "
317345EOF
318346```
319347
320348
321349
322350
323351
324-
325-
326352## ldap批量操作用户
327353
328354### shell脚本方式
@@ -352,7 +378,7 @@ BIND_PWD="admin"
352378LDAP_HOST="localhost"
353379LDAP_HOST_PORT="389"
354380
355- GROUP_DN="cn=go,${BASE_DN}"
381+ GROUP_DN="cn=go,${BASE_DN}" # 这里指定用户基于的组
356382GROUP_GID=1000
357383PASSWORD="{SSHA}uUFY4EJIccmbnIZBPMiq06QK4HG9vO/a" # 创建的用户密码为admin
358384DOMAIN="ops.com"
0 commit comments