在 CentOS 7(基于 RHEL 7)中添加一个新用户,通常使用 useradd 命令。下面我将一步步为你演示如何添加用户,并详细解释 Linux 系统在此过程中做了什么、修改了哪些关键文件。
✅ 一、添加用户的操作步骤
假设我们要添加一个用户名为 alice 的普通用户,并为其设置密码:
bash
# 1. 添加用户(默认创建家目录、使用默认 shell 等)
sudo useradd -m alice
# 2. 为用户设置密码
sudo passwd alice
-m选项表示如果/home/alice不存在,则自动创建家目录(从/etc/skel复制模板文件)。
你也可以一次性指定更多参数,例如:
bash
sudo useradd -m -s /bin/bash -c "Alice Smith" -G wheel alice
-s /bin/bash:指定登录 shell-c "Alice Smith":添加注释(通常是全名)-G wheel:将用户加入wheel组(该组默认有 sudo 权限)
🔍 二、Linux 在添加用户时发生了什么?
当你运行 useradd 命令时,系统会执行以下操作:
1. 分配 UID 和 GID
- 系统从
/etc/login.defs中读取 UID/GID 范围(普通用户默认从 1000 开始)。 - 为新用户分配一个唯一的 UID(用户 ID)。
- 默认创建一个同名的私有组(如
alice),并分配 GID(组 ID)。
2. 修改关键系统文件
📄 /etc/passwd
-
添加一行记录用户基本信息(不包含密码):
alice:x:1001:1001:Alice Smith:/home/alice:/bin/bash字段含义:
用户名:密码占位符(x):UID:GID:注释:家目录:登录Shell
📄 /etc/shadow
-
添加一行存储加密后的密码(初始为空或
!表示锁定):alice:!:19700:0:99999:7:::!表示账户被锁定(直到你用passwd设置密码)- 后续字段控制密码过期策略等
📄 /etc/group
-
创建一个与用户名同名的组(私有组):
alice:x:1001:
📄 /etc/gshadow
-
对应组的加密信息(通常为空或
!):alice:!::
3. 创建家目录
- 如果使用
-m,系统会从/etc/skel复制模板文件到/home/alice- 如
.bashrc,.bash_profile,.vimrc等
- 如
- 设置属主为
alice:alice,权限通常为700
4. 可选:加入附加组
- 如果使用
-G,还会修改/etc/group,在对应组的成员列表末尾加上用户名- 例如
wheel:x:10:root,alice
- 例如
🛠️ 三、验证用户是否创建成功
bash
# 查看用户信息
id alice
# 查看 passwd 条目
grep alice /etc/passwd
# 查看家目录
ls -ld /home/alice
📚 四、相关配置文件说明
| 文件 | 作用 |
|---|---|
/etc/passwd |
存储用户账户基本信息(非敏感) |
/etc/shadow |
存储加密密码及密码策略(仅 root 可读) |
/etc/group |
存储组信息 |
/etc/gshadow |
存储组密码(很少用) |
/etc/skel/ |
新用户家目录的模板 |
/etc/login.defs |
定义 UID/GID 范围、密码过期策略等全局默认值 |
/etc/default/useradd |
useradd 命令的默认行为配置(如默认 shell、家目录位置等) |
⚠️ 注意事项
- 不要手动编辑
/etc/passwd或/etc/shadow,应使用useradd、usermod、passwd等工具。 - 若需批量创建用户,可考虑使用脚本或
newusers命令。 - 在 SELinux 启用的系统(如 CentOS 7 默认开启),家目录会自动打上正确的 SELinux 上下文(如
user_home_t)。
脚本实现
下面创建一个 安全、健壮、适用于 CentOS 7 的 Bash 脚本,用于创建新用户,并完成以下操作:
- 检查是否以 root 运行
- 检查用户名是否已存在
- 创建用户(带家目录)
- 设置密码(可选交互式或传参)
- 可选:加入
wheel组以启用sudo权限 - 自动设置合理的家目录权限
✅ 脚本:create_user.sh
bash
#!/bin/bash
# create_user.sh - 在 CentOS 7 上安全地创建新用户
# 用法: sudo ./create_user.sh <username> [password]
set -e # 遇到错误立即退出
# 检查是否为 root 用户
if [[ $EUID -ne 0 ]]; then
echo "❌ 错误:此脚本必须以 root 权限运行(使用 sudo)"
exit 1
fi
# 检查参数
if [[ $# -lt 1 ]]; then
echo "用法: $0 <用户名> [密码]"
echo "示例: $0 alice mySecurePass123"
exit 1
fi
USERNAME="$1"
PASSWORD="${2:-}"
# 检查用户是否已存在
if id "$USERNAME" &>/dev/null; then
echo "❌ 用户 '$USERNAME' 已存在!"
exit 1
fi
# 默认 shell 和组
DEFAULT_SHELL="/bin/bash"
echo "🔧 正在创建用户: $USERNAME"
# 创建用户(-m 表示创建家目录,-s 指定 shell)
useradd -m -s "$DEFAULT_SHELL" "$USERNAME"
# 设置密码
if [[ -z "$PASSWORD" ]]; then
echo "🔑 请为用户 '$USERNAME' 设置密码(交互式):"
passwd "$USERNAME"
else
# 非交互式设置密码(适合自动化)
echo "$USERNAME:$PASSWORD" | chpasswd
echo "✅ 密码已设置(非交互模式)"
fi
# 可选:询问是否加入 wheel 组(启用 sudo)
read -p "是否将用户 '$USERNAME' 加入 'wheel' 组以启用 sudo 权限?(y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
usermod -aG wheel "$USERNAME"
echo "✅ 用户 '$USERNAME' 已加入 wheel 组(可使用 sudo)"
else
echo "ℹ️ 未加入 wheel 组。如需 sudo 权限,请手动运行: usermod -aG wheel $USERNAME"
fi
# 确保家目录权限正确
HOME_DIR="/home/$USERNAME"
chown -R "$USERNAME:$USERNAME" "$HOME_DIR"
chmod 700 "$HOME_DIR"
echo "🎉 用户 '$USERNAME' 创建成功!"
echo "🏠 家目录: $HOME_DIR"
echo "쉘: $DEFAULT_SHELL"
📝 使用方法
-
保存脚本 (例如保存为
/root/create_user.sh) -
添加执行权限:
bashchmod +x /root/create_user.sh -
运行方式:
-
交互式设置密码:
bashsudo /root/create_user.sh alice→ 脚本会提示你输入密码。
-
非交互式(自动设置密码):
bashsudo /root/create_user.sh alice 'MyP@ssw0rd123'⚠️ 注意:在命令行中明文写密码可能被历史记录泄露,生产环境建议用交互式或更安全的方式(如从文件读取)。
-
-
测试登录:
bashsu - alice
🔒 安全建议
- 不要在脚本中硬编码密码(尤其不要提交到 Git)。
- 如果用于自动化部署,可考虑从加密文件或环境变量读取密码。
- 确保
/etc/sudoers中已启用%wheel ALL=(ALL) NOPASSWD: ALL或类似规则(CentOS 7 默认已配置,但可能需要取消注释)。