Skip to content

Commit e68a481

Browse files
author
pptfz
committed
更新ldap笔记
1 parent 8e60ee7 commit e68a481

4 files changed

Lines changed: 355 additions & 55 deletions

File tree

docs/Linux/Linux服务/ldap/openldap/ldap批量操作.md

Lines changed: 79 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,55 @@
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
1128
go
1229
java
1330
python
14-
php
15-
c
16-
c++
17-
c#
1831
EOF
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)
@@ -155,8 +182,6 @@ AAA
155182

156183
- 基本配置文件
157184

158-
:::tip 说明
159-
160185
| 参数 | 说明 |
161186
| ------------------------------------------- | ------------------------------------------------------ |
162187
| `dn: cn=devops,ou=Groups,dc=example,dc=com` | 这条记录在 LDAP 树中的绝对路径 |
@@ -165,7 +190,7 @@ AAA
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
193220
LDAP_HOST="localhost"
194221
LDAP_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
220247
while read -r GROUPNAME
221248
do
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
234260
dn: ${DN}
235261
objectClass: top
236262
objectClass: posixGroup
@@ -246,6 +272,7 @@ EOF
246272
247273
CURRENT_GID=$((CURRENT_GID+1))
248274
done < "$GROUP_FILE"
275+
249276
AAA
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" # 管理员密码
269296
LDAP_HOST="localhost"
270297
LDAP_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
295322
do
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"
317345
EOF
318346
```
319347

320348

321349

322350

323351

324-
325-
326352
## ldap批量操作用户
327353

328354
### shell脚本方式
@@ -352,7 +378,7 @@ BIND_PWD="admin"
352378
LDAP_HOST="localhost"
353379
LDAP_HOST_PORT="389"
354380
355-
GROUP_DN="cn=go,${BASE_DN}"
381+
GROUP_DN="cn=go,${BASE_DN}" # 这里指定用户基于的组
356382
GROUP_GID=1000
357383
PASSWORD="{SSHA}uUFY4EJIccmbnIZBPMiq06QK4HG9vO/a" # 创建的用户密码为admin
358384
DOMAIN="ops.com"

docs/Linux/Linux服务/ldap/openldap/openldap备份恢复.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -732,13 +732,20 @@ docker start openldap
732732

733733

734734

735-
735+
备份
736736

737737
```yaml
738-
738+
docker exec openldap slapcat -F /bitnami/openldap/slapd.d -b "dc=zmexing,dc=com" -l /tmp/backup.ldif
739+
docker cp openldap:/tmp/backup.ldif ./backup-$(date +%Y%m%d).ldif
739740
```
740741

741742

742743

743744

744745

746+
恢复
747+
748+
```
749+
slapadd -F /bitnami/openldap/slapd.d -b "dc=zmexing,dc=com" -l backup.ldif
750+
```
751+

0 commit comments

Comments
 (0)