Linux 下添加用户相关

在 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,应使用 useraddusermodpasswd 等工具。
  • 若需批量创建用户,可考虑使用脚本或 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"

📝 使用方法

  1. 保存脚本 (例如保存为 /root/create_user.sh

  2. 添加执行权限

    bash 复制代码
    chmod +x /root/create_user.sh
  3. 运行方式

    • 交互式设置密码

      bash 复制代码
      sudo /root/create_user.sh alice

      → 脚本会提示你输入密码。

    • 非交互式(自动设置密码)

      bash 复制代码
      sudo /root/create_user.sh alice 'MyP@ssw0rd123'

      ⚠️ 注意:在命令行中明文写密码可能被历史记录泄露,生产环境建议用交互式或更安全的方式(如从文件读取)。

  4. 测试登录

    bash 复制代码
    su - alice

🔒 安全建议

  • 不要在脚本中硬编码密码(尤其不要提交到 Git)。
  • 如果用于自动化部署,可考虑从加密文件或环境变量读取密码。
  • 确保 /etc/sudoers 中已启用 %wheel ALL=(ALL) NOPASSWD: ALL 或类似规则(CentOS 7 默认已配置,但可能需要取消注释)。
相关推荐
零基础的修炼2 小时前
Linux网络---网络层
运维·服务器·网络
Trouvaille ~2 小时前
【Linux】线程同步与互斥(三):生产者消费者模型实战
linux·运维·c++·信号量·阻塞队列·生产者消费者模型·环形队列
遇见火星2 小时前
Linux Screen 命令入门指南
linux·运维·服务器
Doro再努力3 小时前
【Linux操作系统06】深入理解权限掩码与粘滞位
linux·运维·服务器
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [drivers][dma]stm32-dma
linux·笔记·学习
mzhan0173 小时前
[Linux] vdso 32bit vs 64bit
linux·运维·服务器
旖旎夜光3 小时前
Linux(13)(上)
linux·网络
忧郁的橙子.3 小时前
26期_01_Pyhton linux基本命令
linux·运维·服务器
郝学胜-神的一滴3 小时前
深入解析Linux网络编程之bind函数:从基础到实践的艺术
linux·服务器·网络·c++·websocket·程序人生