跳到主要内容

Linux 用户与组管理

本文档介绍 Linux 系统中用户和组的创建、修改、删除以及权限分配操作。适用于 Debian/Ubuntu 系发行版,其他发行版命令基本一致。

1. 用户管理

1.1 创建用户

使用 useraddadduser 命令创建新用户。

方式一: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 将用户添加到组

使用 usermodgpasswd 命令将用户加入指定组。

方式一: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-dataWeb 服务器用户组(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 中的 2SGID 位,确保在该目录下新建的文件自动归属于 dev-team
  • 770 表示:所有者可读写执行,组成员可读写执行,其他用户无权限

验证

# 检查用户和组关系
id alice
id bob
id charlie

# 检查组信息
getent group dev-team
getent group ops-team

# 检查目录权限
ls -ld /srv/project