Linux 用户与组管理
本文档介绍 Linux 系统中用户和组的创建、修改、删除以及权限分配操作。适用于 Debian/Ubuntu 系发行版,其他发行版命令基本一致。
1. 用户管理
1.1 创建用户
使用 useradd 或 adduser 命令创建新用户。
方式一:useradd(底层命令,推荐用于脚本)
# 创建用户,同时创建家目录,指定默认 Shell 为 bash
sudo useradd -m -s /bin/bash 用户名
# 示例
sudo useradd -m -s /bin/bash john
方式二:adduser(交互式命令,推荐用于手动操作)
sudo adduser 用户名
# 示例
sudo adduser john
adduser 会交互式引导你设置密码、全名、电话等信息,并自动创建家目录。
参数说明
| 参数 | 说明 |
|---|---|
-m | 创建用户家目录(/home/用户名) |
-s | 指定用户默认 Shell |
-d | 指定自定义家目录路径 |
-u | 指定用户 UID |
-g | 指定用户初始组(GID 或组名) |
-G | 指定用户附加组(多个用逗号分隔) |
-e | 指定账户过期时间(YYYY-MM-DD) |
-c | 添加用户备注信息 |
⚠️ 注意: 单独使用
useradd 用户名(不加-m)不会创建家目录,也不设置密码,用户无法登录。务必加-m参数或后续补设。
1.2 设置用户密码
创建用户后,需要为其设置密码:
sudo passwd 用户名
# 示例
sudo passwd john
输入两次密码即可。密码不会显示在屏幕上。
1.3 修改用户属性
使用 usermod 命令修改已有用户的属性。
# 修改用户名
sudo usermod -l 新用户名 旧用户名
# 修改用户家目录(同时迁移数据)
sudo usermod -d /home/新路径 -m 用户名
# 修改默认 Shell
sudo usermod -s /bin/zsh 用户名
# 修改用户 UID
sudo usermod -u 2000 用户名
# 锁定用户(禁止登录)
sudo usermod -L 用户名
# 解锁用户
sudo usermod -U 用户名
# 设置账户过期时间
sudo usermod -e 2026-12-31 用户名
⚠️ 注意: 修改用户名或家目录前,确保该用户没有正在运行的进程,否则需先终止其所有进程:
sudo pkill -u 用户名
1.4 删除用户
使用 userdel 命令删除用户。
# 仅删除用户,保留家目录
sudo userdel 用户名
# 删除用户,同时删除家目录和邮件池
sudo userdel -r 用户名
# 示例
sudo userdel -r john
| 参数 | 说明 |
|---|---|
-r | 删除用户的同时删除家目录和邮件池 |
-f | 强制删除,即使用户仍登录中 |
⚠️ 注意: 删除用户前,确认该用户没有拥有正在运行的服务或关键文件。如有,需先转移文件所有权:
sudo find / -user 用户名 -exec chown 新用户:新组 {} \;
1.5 查看用户信息
# 查看用户 UID、GID 及所属组
id 用户名
# 查看用户所属的所有组
groups 用户名
# 查看用户的详细信息
finger 用户名 # 需安装:sudo apt install finger
# 查看当前登录用户
whoami
# 查看系统中所有用户
cat /etc/passwd | grep 用户名
2. 组管理
2.1 创建组
使用 groupadd 命令创建新组。
sudo groupadd 组名
# 示例:创建开发组
sudo groupadd developers
# 指定 GID
sudo groupadd -g 3000 developers
| 参数 | 说明 |
|---|---|
-g | 指定组 GID |
-r | 创建系统组(GID < 1000) |
2.2 修改组属性
使用 groupmod 命令修改组属性。
# 修改组名
sudo groupmod -n 新组名 旧组名
# 修改组 GID
sudo groupmod -g 4000 组名
2.3 删除组
使用 groupdel 命令删除组。
sudo groupdel 组名
# 示例
sudo groupdel developers
⚠️ 注意: 如果某个用户的主组是要删除的组,需要先移除或更改该用户的主组后才能删除组。
2.4 查看组信息
# 查看系统中所有组
cat /etc/group
# 查看指定组的信息
getent group 组名
# 查看组中包含哪些用户
grep 组名 /etc/group
3. 用户与组关联
3.1 将用户添加到组
使用 usermod 或 gpasswd 命令将用户加入指定组。
方式一:usermod(推荐)
# 将用户添加到附加组(-a 追加,不移除已有的其他组)
sudo usermod -aG 组名 用户名
# 同时添加到多个组
sudo usermod -aG 组1,组2,组3 用户名
方式二:gpasswd
# 将用户添加到组
sudo gpasswd -a 用户名 组名
# 从组中移除用户
sudo gpasswd -d 用户名 组名
参数说明
| 命令 | 参数 | 说明 |
|---|---|---|
usermod | -aG | 追加用户到附加组,保留已有组(必须配合 -a) |
usermod | -G | 替换用户的附加组(不加 -a 会移除其他附加组) |
gpasswd | -a | 添加用户到组 |
gpasswd | -d | 从组中移除用户 |
⚠️ 关键区别:
usermod -G不加-a会用新组列表覆盖用户的附加组。务必使用-aG来追加。
⚠️ 生效条件: 用户需要重新登录后,新的组成员身份才会生效。或使用
su - 用户名切换到该用户立即生效。
3.2 修改用户的主组
每个用户有一个主组(primary group),创建用户时自动生成(通常与用户名同名)。
# 更改用户的主组
sudo usermod -g 新主组名 用户名
# 示例:将 john 的主组改为 developers
sudo usermod -g developers john
⚠️ 注意: 主组更改后,用户之前创建的文件所属组不会自动改变。如需批量修改文件所属组,使用:
sudo chgrp -R 新组 /path/to/dir
3.3 设置组管理员
gpasswd 还可以为组设置管理员,允许组管理员自行管理组成员。
# 设置组管理员
sudo gpasswd -A 用户名 组名
# 设置组密码
sudo gpasswd 组名
设置后,组管理员可以在不使用 sudo 的情况下管理组成员:
# 组管理员添加成员
gpasswd -a 用户名 组名
# 组管理员移除成员
gpasswd -d 用户名 组名
4. 常见组用途
Debian/Ubuntu 系统中预置了一些特殊权限组:
| 组名 | 功能说明 |
|---|---|
sudo | 允许用户使用 sudo 执行管理员命令(Debian) |
wheel | 允许用户使用 sudo(RHEL/CentOS/Fedora) |
docker | 允许用户无需 sudo 运行 Docker 命令 |
www-data | Web 服务器用户组(Nginx/Apache) |
staff | 系统运维人员组,可写入 /usr/local |
audio | 访问音频设备 |
video | 访问视频设备 |
cdrom | 访问光驱设备 |
常见操作示例
# 授予用户 sudo 权限
sudo usermod -aG sudo 用户名
# 授予用户 Docker 使用权限(免 sudo)
sudo usermod -aG docker 用户名
# 将 Nginx 用户加入应用用户组(用于读取应用文件)
sudo usermod -aG 应用组名 www-data
5. 批量操作
5.1 批量创建用户
# 使用 for 循环批量创建用户
for user in alice bob charlie; do
sudo useradd -m -s /bin/bash $user
echo "$user:初始密码" | sudo chpasswd
done
5.2 批量添加用户到组
# 使用 gpasswd 批量添加
for user in alice bob charlie; do
sudo gpasswd -a $user developers
done
5.3 使用 newusers 批量导入用户
创建一个用户列表文件 users.txt,格式为 用户名:密码:UID:GID:备注:家目录:Shell:
alice:password1:1001:1001:Alice:/home/alice:/bin/bash
bob:password2:1002:1002:Bob:/home/bob:/bin/bash
然后执行:
sudo newusers users.txt
6. 完整示例
以下是一个完整的实战场景:创建开发团队的用户和组结构。
# 1. 创建项目组
sudo groupadd -g 3000 dev-team
sudo groupadd -g 3001 ops-team
# 2. 创建用户并指定附加组
sudo useradd -m -s /bin/bash -G dev-team alice
sudo useradd -m -s /bin/bash -G dev-team bob
sudo useradd -m -s /bin/bash -G ops-team charlie
# 3. 设置密码
echo "alice:SecurePass123" | sudo chpasswd
echo "bob:SecurePass456" | sudo chpasswd
echo "charlie:SecurePass789" | sudo chpasswd
# 4. 授予 alice sudo 权限
sudo usermod -aG sudo alice
# 5. 创建共享项目目录并设置组权限
sudo mkdir -p /srv/project
sudo chown :dev-team /srv/project
sudo chmod 2770 /srv/project # SGID 位,新建文件自动继承组
权限说明
2770中的2为 SGID 位,确保在该目录下新建的文件自动归属于dev-team组770表示:所有者可读写执行,组成员可读写执行,其他用户无权限
验证
# 检查用户和组关系
id alice
id bob
id charlie
# 检查组信息
getent group dev-team
getent group ops-team
# 检查目录权限
ls -ld /srv/project