Part01-基础概念与理论知识
1.1 批量用户创建的应用场景
批量创建用户在以下场景中非常有用:
- 新员工入职:公司新员工入职时需要批量创建账户
- 学生账户:教育机构为学生批量创建学习账户
- 系统迁移:系统迁移时需要批量重建用户账户
- 测试环境:测试环境需要批量创建测试用户
- 服务账户:为应用程序批量创建服务账户
1.2 用户创建相关命令
| 命令 | 功能 | 常用选项 |
|---|---|---|
| useradd | 创建用户账户 | -m(创建家目录)、-g(指定主组)、-G(指定附加组) |
| passwd | 设置用户密码 | –stdin(从标准输入读取密码) |
| usermod | 修改用户账户 | -aG(添加到附加组)、-s(修改登录Shell) |
| chage | 修改密码过期策略 | -d 0(强制首次登录修改密码) |
1.3 密码管理最佳实践
- 强密码策略:设置最小密码长度和复杂度要求
- 首次登录修改:强制用户首次登录时修改密码
- 密码过期:设置密码过期时间,定期更换密码
- 密码历史:记录密码历史,防止重复使用
- 账户锁定:设置登录失败次数,防止暴力破解
Part02-实战环境准备与配置
2.1 创建用户列表文件
# cat > /tmp/user_list.txt << 'EOF' alice:devteam:Alice Johnson bob:devteam:Bob Smith charlie:qa:Charlie Brown david:qa:David Wilson eve:ops:Eve Davis frank:ops:Frank Miller grace:devteam:Grace Lee henry:qa:Henry Taylor irene:ops:Irene Anderson jack:devteam:Jack Thomas EOF # 2. 查看用户列表 # cat /tmp/user_list.txt alice:devteam:Alice Johnson bob:devteam:Bob Smith charlie:qa:Charlie Brown david:qa:David Wilson eve:ops:Eve Davis frank:ops:Frank Miller grace:devteam:Grace Lee henry:qa:Henry Taylor irene:ops:Irene Anderson jack:devteam:Jack Thomas # 3. 验证文件格式 # awk -F: '{print "用户名:", $1, "用户组:", $2, "全名:", $3}' /tmp/user_list.txt 用户名: alice 用户组: devteam 全名: Alice Johnson 用户名: bob 用户组: devteam 全名: Bob Smith 用户名: charlie 用户组: qa 全名: Charlie Brown 用户名: david 用户组: qa 全名: David Wilson 用户名: eve 用户组: ops 全名: Eve Davis 用户名: frank 用户组: ops 全名: Frank Miller 用户名: grace 用户组: devteam 全名: Grace Lee 用户名: henry 用户组: qa 全名: Henry Taylor 用户名: irene 用户组: ops 全名: Irene Anderson 用户名: jack 用户组: devteam 全名: Jack Thomas
2.2 创建用户组
# grep -E “devteam|qa|ops” /etc/group
# 2. 创建用户组
# groupadd devteam
# groupadd qa
# groupadd ops
# 3. 验证用户组创建
# grep -E “devteam|qa|ops” /etc/group
devteam:x:1001:
qa:x:1002:
ops:x:1003:
# 4. 查看用户组详细信息
# getent group devteam qa ops
devteam:x:1001:
qa:x:1002:
ops:x:1003:
Part03-核心命令实操演示
3.1 基础批量用户创建脚本
# cat > /tmp/batch_create_users.sh << 'EOF' #!/bin/bash # 批量用户创建脚本 # 功能:从文件读取用户列表并批量创建用户 # 作者:fgedu # 日期:2026-04-02 # 定义变量 USER_FILE="/tmp/user_list.txt" LOG_FILE="/tmp/user_creation_$(date +%Y%m%d_%H%M%S).log" DEFAULT_PASS="Temp@123" # 创建日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # 创建分隔线函数 separator() { echo "==========================================" | tee -a "$LOG_FILE" } # 开始创建用户 separator log "开始批量创建用户" separator log "用户列表文件:$USER_FILE" log "默认密码:$DEFAULT_PASS" separator # 检查用户文件是否存在 if [ ! -f "$USER_FILE" ]; then log "错误:用户文件 $USER_FILE 不存在" exit 1 fi # 初始化统计变量 total_users=0 success_users=0 failed_users=0 skipped_users=0 # 读取用户文件 while IFS=':' read -r username group comment; do # 跳过空行和注释 [ -z "$username" ] && continue [[ "$username" =~ ^#.* ]] && continue total_users=$((total_users + 1)) log "处理用户:$username" # 检查用户是否已存在 if id "$username" &>/dev/null; then
log “警告:用户 $username 已存在,跳过”
skipped_users=$((skipped_users + 1))
continue
fi
# 检查用户组是否存在
if ! grep -q “^${group}:” /etc/group; then
log “警告:用户组 $group 不存在,跳过用户 $username”
failed_users=$((failed_users + 1))
continue
fi
# 创建用户
log “创建用户:$username”
useradd -g “$group” -c “$comment” -m “$username” 2>> “$LOG_FILE”
# 检查用户创建是否成功
if [ $? -eq 0 ]; then
# 设置默认密码
echo “$DEFAULT_PASS” | passwd –stdin “$username” &>> “$LOG_FILE”
# 强制用户首次登录时修改密码
chage -d 0 “$username” 2>> “$LOG_FILE”
log “用户 $username 创建成功”
log “默认密码:$DEFAULT_PASS”
log “首次登录需要修改密码”
success_users=$((success_users + 1))
else
log “错误:无法创建用户 $username”
failed_users=$((failed_users + 1))
fi
separator
done < "$USER_FILE"
# 显示统计信息
separator
log "用户创建完成"
separator
log "总用户数:$total_users"
log "成功创建:$success_users"
log "创建失败:$failed_users"
log "跳过用户:$skipped_users"
separator
log "日志文件:$LOG_FILE"
separator
exit 0
EOF
# 2. 设置脚本执行权限
# chmod +x /tmp/batch_create_users.sh
# 3. 执行脚本
# /tmp/batch_create_users.sh
==========================================
[2026-04-02 12:00:00] 开始批量创建用户
==========================================
[2026-04-02 12:00:00] 用户列表文件:/tmp/user_list.txt
[2026-04-02 12:00:00] 默认密码:Temp@123
==========================================
[2026-04-02 12:00:00] 处理用户:alice
[2026-04-02 12:00:00] 创建用户:alice
[2026-04-02 12:00:00] 用户 alice 创建成功
[2026-04-02 12:00:00] 默认密码:Temp@123
[2026-04-02 12:00:00] 首次登录需要修改密码
==========================================
[2026-04-02 12:00:00] 处理用户:bob
[2026-04-02 12:00:00] 创建用户:bob
[2026-04-02 12:00:00] 用户 bob 创建成功
[2026-04-02 12:00:00] 默认密码:Temp@123
[2026-04-02 12:00:00] 首次登录需要修改密码
==========================================
[2026-04-02 12:00:00] 处理用户:charlie
[2026-04-02 12:00:00] 创建用户:charlie
[2026-04-02 12:00:00] 用户 charlie 创建成功
[2026-04-02 12:00:00] 默认密码:Temp@123
[2026-04-02 12:00:00] 首次登录需要修改密码
==========================================
[2026-04-02 12:00:00] 处理用户:david
[2026-04-02 12:00:00] 创建用户:david
[2026-04-02 12:00:00] 用户 david 创建成功
[2026-04-02 12:00:00] 默认密码:Temp@123
[2026-04-02 12:00:00] 首次登录需要修改密码
==========================================
[2026-04-02 12:00:00] 处理用户:eve
[2026-04-02 12:00:00] 创建用户:eve
[2026-04-02 12:00:00] 用户 eve 创建成功
[2026-04-02 12:00:00] 默认密码:Temp@123
[2026-04-02 12:00:00] 首次登录需要修改密码
==========================================
[2026-04-02 12:00:00] 处理用户:frank
[2026-04-02 12:00:00] 创建用户:frank
[2026-04-02 12:00:00] 用户 frank 创建成功
[2026-04-02 12:00:00] 默认密码:Temp@123
[2026-04-02 12:00:00] 首次登录需要修改密码
==========================================
[2026-04-02 12:00:00] 处理用户:grace
[2026-04-02 12:00:00] 创建用户:grace
[2026-04-02 12:00:00] 用户 grace 创建成功
[2026-04-02 12:00:00] 默认密码:Temp@123
[2026-04-02 12:00:00] 首次登录需要修改密码
==========================================
[2026-04-02 12:00:00] 处理用户:henry
[2026-04-02 12:00:00] 创建用户:henry
[2026-04-02 12:00:00] 用户 henry 创建成功
[2026-04-02 12:00:00] 默认密码:Temp@123
[2026-04-02 12:00:00] 首次登录需要修改密码
==========================================
[2026-04-02 12:00:00] 处理用户:irene
[2026-04-02 12:00:00] 创建用户:irene
[2026-04-02 12:00:00] 用户 irene 创建成功
[2026-04-02 12:00:00] 默认密码:Temp@123
[2026-04-02 12:00:00] 首次登录需要修改密码
==========================================
[2026-04-02 12:00:00] 处理用户:jack
[2026-04-02 12:00:00] 创建用户:jack
[2026-04-02 12:00:00] 用户 jack 创建成功
[2026-04-02 12:00:00] 默认密码:Temp@123
[2026-04-02 12:00:00] 首次登录需要修改密码
==========================================
[2026-04-02 12:00:00] 用户创建完成
==========================================
[2026-04-02 12:00:00] 总用户数:10
[2026-04-02 12:00:00] 成功创建:10
[2026-04-02 12:00:00] 创建失败:0
[2026-04-02 12:00:00] 跳过用户:0
==========================================
[2026-04-02 12:00:00] 日志文件:/tmp/user_creation_20260402_120000.log
==========================================
# 4. 查看创建的用户
# grep -E "alice|bob|charlie|david|eve|frank|grace|henry|irene|jack" /etc/passwd
alice:x:1001:1001:Alice Johnson:/home/alice:/bin/bash
bob:x:1002:1001:Bob Smith:/home/bob:/bin/bash
charlie:x:1003:1002:Charlie Brown:/home/charlie:/bin/bash
david:x:1004:1002:David Wilson:/home/david:/bin/bash
eve:x:1005:1003:Eve Davis:/home/eve:/bin/bash
frank:x:1006:1003:Frank Miller:/home/frank:/bin/bash
grace:x:1007:1001:Grace Lee:/home/grace:/bin/bash
henry:x:1008:1002:Henry Taylor:/home/henry:/bin/bash
irene:x:1009:1003:Irene Anderson:/home/irene:/bin/bash
jack:x:1010:1001:Jack Thomas:/home/jack:/bin/bash
3.2 增强版批量用户创建脚本
# cat > /tmp/advanced_batch_users.sh << 'EOF' #!/bin/bash # 增强版批量用户创建脚本 # 功能:支持自定义密码、附加组、Shell等高级选项 # 作者:fgedu # 日期:2026-04-02 # 定义变量 USER_FILE="/tmp/user_list_advanced.txt" LOG_FILE="/tmp/user_creation_advanced_$(date +%Y%m%d_%H%M%S).log" PASSWORD_FILE="/tmp/user_passwords_$(date +%Y%m%d_%H%M%S).txt" # 创建日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # 创建分隔线函数 separator() { echo "==========================================" | tee -a "$LOG_FILE" } # 开始创建用户 separator log "开始批量创建用户(增强版)" separator log "用户列表文件:$USER_FILE" log "密码文件:$PASSWORD_FILE" separator # 检查用户文件是否存在 if [ ! -f "$USER_FILE" ]; then log "错误:用户文件 $USER_FILE 不存在" exit 1 fi # 初始化统计变量 total_users=0 success_users=0 failed_users=0 skipped_users=0 # 创建密码文件 > “$PASSWORD_FILE”
# 读取用户文件
while IFS=’:’ read -r username group comment password shell additional_groups; do
# 跳过空行和注释
[ -z “$username” ] && continue
[[ “$username” =~ ^#.* ]] && continue
total_users=$((total_users + 1))
log “处理用户:$username”
# 检查用户是否已存在
if id “$username” &>/dev/null; then
log “警告:用户 $username 已存在,跳过”
skipped_users=$((skipped_users + 1))
continue
fi
# 检查用户组是否存在
if ! grep -q “^${group}:” /etc/group; then
log “警告:用户组 $group 不存在,跳过用户 $username”
failed_users=$((failed_users + 1))
continue
fi
# 设置默认值
password=${password:-“Temp@123”}
shell=${shell:-“/bin/bash”}
# 创建用户
log “创建用户:$username”
useradd -g “$group” -c “$comment” -m -s “$shell” “$username” 2>> “$LOG_FILE”
# 检查用户创建是否成功
if [ $? -eq 0 ]; then
# 设置密码
echo “$password” | passwd –stdin “$username” &>> “$LOG_FILE”
# 强制用户首次登录时修改密码
chage -d 0 “$username” 2>> “$LOG_FILE”
# 添加附加组
if [ -n “$additional_groups” ]; then
log “添加附加组:$additional_groups”
usermod -aG “$additional_groups” “$username” 2>> “$LOG_FILE”
fi
# 记录密码
echo “$username:$password” >> “$PASSWORD_FILE”
log “用户 $username 创建成功”
log “密码:$password”
log “Shell:$shell”
log “主组:$group”
[ -n “$additional_groups” ] && log “附加组:$additional_groups”
success_users=$((success_users + 1))
else
log “错误:无法创建用户 $username”
failed_users=$((failed_users + 1))
fi
separator
done < "$USER_FILE"
# 显示统计信息
separator
log "用户创建完成"
separator
log "总用户数:$total_users"
log "成功创建:$success_users"
log "创建失败:$failed_users"
log "跳过用户:$skipped_users"
separator
log "日志文件:$LOG_FILE"
log "密码文件:$PASSWORD_FILE"
separator
# 设置密码文件权限
chmod 600 "$PASSWORD_FILE"
log "密码文件权限已设置为600"
exit 0
EOF
# 2. 创建增强版用户列表文件
# cat > /tmp/user_list_advanced.txt << 'EOF'
alice:devteam:Alice Johnson:alice123@:/bin/bash:qa
bob:devteam:Bob Smith:bob456@:/bin/bash:ops
charlie:qa:Charlie Brown:charlie789@:/bin/bash:devteam
david:qa:David Wilson:david012@:/bin/bash:ops
eve:ops:Eve Davis:eve345@:/bin/bash:devteam
EOF
# 3. 查看用户列表
# cat /tmp/user_list_advanced.txt
alice:devteam:Alice Johnson:alice123@:/bin/bash:qa
bob:devteam:Bob Smith:bob456@:/bin/bash:ops
charlie:qa:Charlie Brown:charlie789@:/bin/bash:devteam
david:qa:David Wilson:david012@:/bin/bash:ops
eve:ops:Eve Davis:eve345@:/bin/bash:devteam
# 4. 设置脚本执行权限
# chmod +x /tmp/advanced_batch_users.sh
# 5. 执行脚本
# /tmp/advanced_batch_users.sh
==========================================
[2026-04-02 12:01:00] 开始批量创建用户(增强版)
==========================================
[2026-04-02 12:01:00] 用户列表文件:/tmp/user_list_advanced.txt
[2026-04-02 12:01:00] 密码文件:/tmp/user_passwords_20260402_120100.txt
==========================================
[2026-04-02 12:01:00] 处理用户:alice
[2026-04-02 12:01:00] 创建用户:alice
[2026-04-02 12:01:00] 添加附加组:qa
[2026-04-02 12:01:00] 用户 alice 创建成功
[2026-04-02 12:01:00] 密码:alice123@
[2026-04-02 12:01:00] Shell:/bin/bash
[2026-04-02 12:01:00] 主组:devteam
[2026-04-02 12:01:00] 附加组:qa
==========================================
[2026-04-02 12:01:00] 处理用户:bob
[2026-04-02 12:01:00] 创建用户:bob
[2026-04-02 12:01:00] 添加附加组:ops
[2026-04-02 12:01:00] 用户 bob 创建成功
[2026-04-02 12:01:00] 密码:bob456@
[2026-04-02 12:01:00] Shell:/bin/bash
[2026-04-02 12:01:00] 主组:devteam
[2026-04-02 12:01:00] 附加组:ops
==========================================
[2026-04-02 12:01:00] 处理用户:charlie
[2026-04-02 12:01:00] 创建用户:charlie
[2026-04-02 12:01:00] 添加附加组:devteam
[2026-04-02 12:01:00] 用户 charlie 创建成功
[2026-04-02 12:01:00] 密码:charlie789@
[2026-04-02 12:01:00] Shell:/bin/bash
[2026-04-02 12:01:00] 主组:qa
[2026-04-02 12:01:00] 附加组:devteam
==========================================
[2026-04-02 12:01:00] 处理用户:david
[2026-04-02 12:01:00] 创建用户:david
[2026-04-02 12:01:00] 添加附加组:ops
[2026-04-02 12:01:00] 用户 david 创建成功
[2026-04-02 12:01:00] 密码:david012@
[2026-04-02 12:01:00] Shell:/bin/bash
[2026-04-02 12:01:00] 主组:qa
[2026-04-02 12:01:00] 附加组:ops
==========================================
[2026-04-02 12:01:00] 处理用户:eve
[2026-04-02 12:01:00] 创建用户:eve
[2026-04-02 12:01:00] 添加附加组:devteam
[2026-04-02 12:01:00] 用户 eve 创建成功
[2026-04-02 12:01:00] 密码:eve345@
[2026-04-02 12:01:00] Shell:/bin/bash
[2026-04-02 12:01:00] 主组:ops
[2026-04-02 12:01:00] 附加组:devteam
==========================================
[2026-04-02 12:01:00] 用户创建完成
==========================================
[2026-04-02 12:01:00] 总用户数:5
[2026-04-02 12:01:00] 成功创建:5
[2026-04-02 12:01:00] 创建失败:0
[2026-04-02 12:01:00] 跳过用户:0
==========================================
[2026-04-02 12:01:00] 日志文件:/tmp/user_creation_advanced_20260402_120100.log
[2026-04-02 12:01:00] 密码文件:/tmp/user_passwords_20260402_120100.txt
[2026-04-02 12:01:00] 密码文件权限已设置为600
==========================================
# 6. 查看密码文件
# cat /tmp/user_passwords_20260402_120100.txt
alice:alice123@
bob:bob456@
charlie:charlie789@
david:david012@
eve:eve345@
# 7. 查看密码文件权限
# ls -l /tmp/user_passwords_20260402_120100.txt
-rw-------. 1 root root 85 Apr 2 12:01:00 /tmp/user_passwords_20260402_120100.txt
3.3 验证用户创建
# grep -E “alice|bob|charlie|david|eve” /etc/passwd
alice:x:1001:1001:Alice Johnson:/home/alice:/bin/bash
bob:x:1002:1001:Bob Smith:/home/bob:/bin/bash
charlie:x:1003:1002:Charlie Brown:/home/charlie:/bin/bash
david:x:1004:1002:David Wilson:/home/david:/bin/bash
eve:x:1005:1003:Eve Davis:/home/eve:/bin/bash
# 2. 查看用户组信息
# groups alice
alice : devteam qa
# groups bob
bob : devteam ops
# groups charlie
charlie : qa devteam
# groups david
david : qa ops
# groups eve
eve : ops devteam
# 3. 查看用户密码状态
# passwd -S alice
alice PS 2026-04-02 0 99999 7 -1 (Password set, SHA512 crypt.)
# passwd -S bob
bob PS 2026-04-02 0 99999 7 -1 (Password set, SHA512 crypt.)
# 4. 查看用户家目录
# ls -la /home/ | grep -E “alice|bob|charlie|david|eve”
drwx——. 2 alice devteam 4096 Apr 2 12:01 alice
drwx——. 2 bob devteam 4096 Apr 2 12:01 bob
drwx——. 2 charlie qa 4096 Apr 2 12:01 charlie
drwx——. 2 david qa 4096 Apr 2 12:01 david
drwx——. 2 eve ops 4096 Apr 2 12:01 eve
# 5. 测试用户登录
# su – alice
$ whoami
alice
$ pwd
/home/alice
$ exit
logout
# 6. 查看用户登录Shell
# grep -E “alice|bob|charlie|david|eve” /etc/passwd | cut -d: -f1,7
alice:/bin/bash
bob:/bin/bash
charlie:/bin/bash
david:/bin/bash
eve:/bin/bash
Part04-生产环境实战案例
4.1 批量删除用户脚本
# cat > /tmp/batch_delete_users.sh << 'EOF' #!/bin/bash # 批量删除用户脚本 # 功能:从文件读取用户列表并批量删除用户 # 作者:fgedu # 日期:2026-04-02 # 定义变量 USER_FILE="/tmp/user_list_delete.txt" LOG_FILE="/tmp/user_deletion_$(date +%Y%m%d_%H%M%S).log" BACKUP_DIR="/tmp/user_backups/$(date +%Y%m%d_%H%M%S)" # 创建日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # 创建分隔线函数 separator() { echo "==========================================" | tee -a "$LOG_FILE" } # 开始删除用户 separator log "开始批量删除用户" separator log "用户列表文件:$USER_FILE" log "备份目录:$BACKUP_DIR" separator # 检查用户文件是否存在 if [ ! -f "$USER_FILE" ]; then log "错误:用户文件 $USER_FILE 不存在" exit 1 fi # 创建备份目录 mkdir -p "$BACKUP_DIR" # 初始化统计变量 total_users=0 success_users=0 failed_users=0 skipped_users=0 # 读取用户文件 while read -r username; do # 跳过空行和注释 [ -z "$username" ] && continue [[ "$username" =~ ^#.* ]] && continue total_users=$((total_users + 1)) log "处理用户:$username" # 检查用户是否存在 if ! id "$username" &>/dev/null; then
log “警告:用户 $username 不存在,跳过”
skipped_users=$((skipped_users + 1))
continue
fi
# 备份用户家目录
if [ -d “/home/$username” ]; then
log “备份用户家目录:/home/$username”
tar -czf “$BACKUP_DIR/${username}_home.tar.gz” -C /home “$username” 2>> “$LOG_FILE”
fi
# 删除用户
log “删除用户:$username”
userdel -r “$username” 2>> “$LOG_FILE”
# 检查用户删除是否成功
if [ $? -eq 0 ]; then
log “用户 $username 删除成功”
success_users=$((success_users + 1))
else
log “错误:无法删除用户 $username”
failed_users=$((failed_users + 1))
fi
separator
done < "$USER_FILE"
# 显示统计信息
separator
log "用户删除完成"
separator
log "总用户数:$total_users"
log "成功删除:$success_users"
log "删除失败:$failed_users"
log "跳过用户:$skipped_users"
separator
log "日志文件:$LOG_FILE"
log "备份目录:$BACKUP_DIR"
separator
exit 0
EOF
# 2. 创建要删除的用户列表
# cat > /tmp/user_list_delete.txt << 'EOF'
alice
bob
charlie
EOF
# 3. 设置脚本执行权限
# chmod +x /tmp/batch_delete_users.sh
# 4. 执行脚本
# /tmp/batch_delete_users.sh
==========================================
[2026-04-02 12:02:00] 开始批量删除用户
==========================================
[2026-04-02 12:02:00] 用户列表文件:/tmp/user_list_delete.txt
[2026-04-02 12:02:00] 备份目录:/tmp/user_backups/20260402_120200
==========================================
[2026-04-02 12:02:00] 处理用户:alice
[2026-04-02 12:02:00] 备份用户家目录:/home/alice
[2026-04-02 12:02:00] 删除用户:alice
[2026-04-02 12:02:00] 用户 alice 删除成功
==========================================
[2026-04-02 12:02:00] 处理用户:bob
[2026-04-02 12:02:00] 备份用户家目录:/home/bob
[2026-04-02 12:02:00] 删除用户:bob
[2026-04-02 12:02:00] 用户 bob 删除成功
==========================================
[2026-04-02 12:02:00] 处理用户:charlie
[2026-04-02 12:02:00] 备份用户家目录:/home/charlie
[2026-04-02 12:02:00] 删除用户:charlie
[2026-04-02 12:02:00] 用户 charlie 删除成功
==========================================
[2026-04-02 12:02:00] 用户删除完成
==========================================
[2026-04-02 12:02:00] 总用户数:3
[2026-04-02 12:02:00] 成功删除:3
[2026-04-02 12:02:00] 删除失败:0
[2026-04-02 12:02:00] 跳过用户:0
==========================================
[2026-04-02 12:02:00] 日志文件:/tmp/user_deletion_20260402_120200.log
[2026-04-02 12:02:00] 备份目录:/tmp/user_backups/20260402_120200
==========================================
# 5. 查看备份文件
# ls -lh /tmp/user_backups/20260402_120200/
total 24K
-rw-r--r--. 1 root root 8.0K Apr 2 12:02:00 alice_home.tar.gz
-rw-r--r--. 1 root root 8.0K Apr 2 12:02:00 bob_home.tar.gz
-rw-r--r--. 1 root root 8.0K Apr 2 12:02:00 charlie_home.tar.gz
4.2 用户密码批量修改脚本
# cat > /tmp/batch_change_passwords.sh << 'EOF' #!/bin/bash # 用户密码批量修改脚本 # 功能:从文件读取用户列表并批量修改密码 # 作者:fgedu # 日期:2026-04-02 # 定义变量 USER_FILE="/tmp/user_password_change.txt" LOG_FILE="/tmp/password_change_$(date +%Y%m%d_%H%M%S).log" NEW_PASSWORD="NewPass@2026" # 创建日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # 创建分隔线函数 separator() { echo "==========================================" | tee -a "$LOG_FILE" } # 开始修改密码 separator log "开始批量修改用户密码" separator log "用户列表文件:$USER_FILE" separator # 检查用户文件是否存在 if [ ! -f "$USER_FILE" ]; then log "错误:用户文件 $USER_FILE 不存在" exit 1 fi # 初始化统计变量 total_users=0 success_users=0 failed_users=0 skipped_users=0 # 读取用户文件 while read -r username; do # 跳过空行和注释 [ -z "$username" ] && continue [[ "$username" =~ ^#.* ]] && continue total_users=$((total_users + 1)) log "处理用户:$username" # 检查用户是否存在 if ! id "$username" &>/dev/null; then
log “警告:用户 $username 不存在,跳过”
skipped_users=$((skipped_users + 1))
continue
fi
# 修改密码
log “修改用户密码:$username”
echo “$NEW_PASSWORD” | passwd –stdin “$username” &>> “$LOG_FILE”
# 检查密码修改是否成功
if [ $? -eq 0 ]; then
# 强制用户下次登录修改密码
chage -d 0 “$username” 2>> “$LOG_FILE”
log “用户 $username 密码修改成功”
log “新密码:$NEW_PASSWORD”
log “下次登录需要修改密码”
success_users=$((success_users + 1))
else
log “错误:无法修改用户 $username 的密码”
failed_users=$((failed_users + 1))
fi
separator
done < "$USER_FILE"
# 显示统计信息
separator
log "密码修改完成"
separator
log "总用户数:$total_users"
log "成功修改:$success_users"
log "修改失败:$failed_users"
log "跳过用户:$skipped_users"
separator
log "日志文件:$LOG_FILE"
separator
exit 0
EOF
# 2. 创建要修改密码的用户列表
# cat > /tmp/user_password_change.txt << 'EOF'
david
eve
grace
henry
irene
jack
EOF
# 3. 设置脚本执行权限
# chmod +x /tmp/batch_change_passwords.sh
# 4. 执行脚本
# /tmp/batch_change_passwords.sh
==========================================
[2026-04-02 12:03:00] 开始批量修改用户密码
==========================================
[2026-04-02 12:03:00] 用户列表文件:/tmp/user_password_change.txt
==========================================
[2026-04-02 12:03:00] 处理用户:david
[2026-04-02 12:03:00] 修改用户密码:david
[2026-04-02 12:03:00] 用户 david 密码修改成功
[2026-04-02 12:03:00] 新密码:NewPass@2026
[2026-04-02 12:03:00] 下次登录需要修改密码
==========================================
[2026-04-02 12:03:00] 处理用户:eve
[2026-04-02 12:03:00] 修改用户密码:eve
[2026-04-02 12:03:00] 用户 eve 密码修改成功
[2026-04-02 12:03:00] 新密码:NewPass@2026
[2026-04-02 12:03:00] 下次登录需要修改密码
==========================================
[2026-04-02 12:03:00] 处理用户:grace
[2026-04-02 12:03:00] 修改用户密码:grace
[2026-04-02 12:03:00] 用户 grace 密码修改成功
[2026-04-02 12:03:00] 新密码:NewPass@2026
[2026-04-02 12:03:00] 下次登录需要修改密码
==========================================
[2026-04-02 12:03:00] 处理用户:henry
[2026-04-02 12:03:00] 修改用户密码:henry
[2026-04-02 12:03:00] 用户 henry 密码修改成功
[2026-04-02 12:03:00] 新密码:NewPass@2026
[2026-04-02 12:03:00] 下次登录需要修改密码
==========================================
[2026-04-02 12:03:00] 处理用户:irene
[2026-04-02 12:03:00] 修改用户密码:irene
[2026-04-02 12:03:00] 用户 irene 密码修改成功
[2026-04-02 12:03:00] 新密码:NewPass@2026
[2026-04-02 12:03:00] 下次登录需要修改密码
==========================================
[2026-04-02 12:03:00] 处理用户:jack
[2026-04-02 12:03:00] 修改用户密码:jack
[2026-04-02 12:03:00] 用户 jack 密码修改成功
[2026-04-02 12:03:00] 新密码:NewPass@2026
[2026-04-02 12:03:00] 下次登录需要修改密码
==========================================
[2026-04-02 12:03:00] 密码修改完成
==========================================
[2026-04-02 12:03:00] 总用户数:6
[2026-04-02 12:03:00] 成功修改:6
[2026-04-02 12:03:00] 修改失败:0
[2026-04-02 12:03:00] 跳过用户:0
==========================================
[2026-04-02 12:03:00] 日志文件:/tmp/password_change_20260402_120300.log
==========================================
Part05-风哥经验总结与分享
5.1 批量用户管理最佳实践
- 备份优先:在批量删除用户前,务必备份用户数据和配置
- 测试验证:在生产环境执行前,先在测试环境验证脚本
- 日志记录:详细记录每个操作,便于审计和问题追踪
- 分批处理:对于大批量用户,建议分批处理,避免系统负载过高
- 密码安全:密码文件应设置严格的权限,避免泄露
5.2 密码管理建议
- 强制修改:使用chage -d 0强制用户首次登录修改密码
- 密码策略:设置密码复杂度要求和过期策略
- 定期更换:建立定期更换密码的机制
- 密码历史:记录密码历史,防止重复使用
- 账户锁定:设置登录失败次数,防止暴力破解
5.3 安全注意事项
- 密码文件应设置为600权限,仅root可读写
- 避免在脚本中硬编码密码,使用加密存储
- 定期审计用户账户,删除不活跃账户
- 限制sudo权限,避免权限滥用
- 监控异常登录行为,及时发现安全威胁
5.4 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 用户创建失败 | 用户组不存在、UID冲突 | 检查用户组是否存在,使用-u指定UID |
| 密码设置失败 | 密码不符合策略、权限不足 | 检查密码策略,使用root权限执行 |
| 家目录创建失败 | 磁盘空间不足、权限问题 | 检查磁盘空间,检查目录权限 |
| 用户无法登录 | Shell设置错误、账户被锁定 | 检查Shell设置,解锁账户 |
批量用户管理是系统运维的常见任务,一个好的批量用户管理脚本应该具备完善的日志记录、错误处理、数据备份等功能。在生产环境中,建议先在测试环境验证脚本,确保脚本的正确性和安全性。同时,要建立完善的用户管理制度,定期审计用户账户,及时发现和处理安全隐患。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
