↑ 顶部/笔记 2026-10-25 · 约 12 分钟

用户、组与权限

一句话总结:用户是员工、组是部门、权限是门禁卡——进程以某个用户身份运行,操作文件时按“属主 → 属组 → 其他人”依次匹配。 适用:Rocky Linux / CentOS 9,UID/GID 规则以 RHEL 系为准。

更新于 2026-10-25 · 正文约 4827 字

一、为什么需要用户和组

把系统想成一家公司:

概念 类比 说明
用户 user 员工 每个进程都以某个用户身份运行
超级管理员 root 老板 UID 为 0,权限最高
组 group 部门 批量管理权限,一个用户可属于多个组

权限也分三类对象:

对象 缩写 含义
属主 u(user/owner) 文件归谁所有
属组 g(group) 文件属于哪个组
其他人 o(other) 既不是属主也不在属组里的用户

二、权限匹配规则(重要)

进程操作文件时,内核按顺序匹配一次,匹配到就停:

1. 进程用户 == 文件属主?   是 → 用属主权限(u),结束
2. 进程用户属于文件属组?   是 → 用属组权限(g),结束
3. 都不满足               → 用其他人权限(o)

注意:不是取并集。如果命中属主,就只看属主的 3 位,哪怕属组权限更宽也不看。 root 例外:root 几乎不受权限限制(但对 x 仍有要求)。

进程的身份从哪来?

ps aux        # 第一列就是进程的运行用户
whoami        # 当前登录用户
id            # 当前用户的 uid/gid/组
  • 默认以当前登录用户的身份运行;
  • 也可以配置程序以指定用户启动(如 nginx 的 user nginx;、systemd 的 User=)。

三、用户管理

3.1 UID 与 GID

范围 用途
0 root(超级管理员),通常只有一个
1–999 系统用户(服务账号,如 sshd、nginx)
≥1000 后续创建的普通用户(RHEL 系默认从 1000 开始)
  • 主组(primary group):创建用户时默认建一个同名组,作为主组;id 里的 gid= 就是它。
  • 附加组(supplementary group):额外加入的组,可以有多个。
  • groups 显示的是主组 + 附加组。

3.2 useradd 创建用户

选项 作用 示例
-u UID 指定 UID -u 2000
-g 组 指定主组(组必须已存在) -g it
-G 组1,组2 指定附加组 -G sale,dev
-d 目录 指定家目录路径 -d /abc
-m 创建家目录(默认会建)
-M 不创建家目录
-s shell 指定登录 shell -s /sbin/nologin
-c 备注 注释/描述 -c "测试账号"
-e 日期 账号过期时间 -e 2026-12-31
-r 创建系统用户(UID < 1000)
-k 目录 指定 skel 模板目录
useradd egon                                     # 最简:建用户 + 同名主组 + 家目录
useradd lili -s /sbin/nologin -u 2000 -g it -G sale -d /abc
passwd egon                                      # 交互式设置密码
echo "123456" | passwd --stdin egon              # 非交互式(脚本里用)

-s /sbin/nologin 表示该用户不能登录 shell,只能跑服务,服务账号常用。 -g、-G 里的组必须提前存在,否则报错。

3.3 查看用户

id egon              # uid、gid、所属组
id -u egon           # 只取 UID
id -g egon           # 只取主组 GID
id -Gn egon          # 所有组名
groups egon
who                  # 当前登录的会话
whoami
w                    # 谁登录了、在干什么
last                 # 登录历史

3.4 修改用户 usermod

选项 作用
-u UID 改 UID
-g 组 改主组
-G 组1,组2 覆盖附加组列表
-a -G 组 追加附加组(-a 必须和 -G 一起用)
-d 目录 / -m 改家目录 / 同时搬移旧家目录内容
-s shell 改登录 shell
-l 新名 改用户名
-L / -U 锁定 / 解锁账号
-e 日期 改过期时间
usermod -g group1 lili          # 改主组
usermod -a -G group2 lili       # 追加附加组(不加 -a 会覆盖掉原来的附加组!)
usermod -s /sbin/nologin lili
usermod -L lili                 # 锁定

3.5 删除用户

userdel -r tom     # 删用户,同时删家目录和邮箱
userdel tom        # 只删账号,家目录残留(可能造成 UID 复用后权限错乱)

-r 会一并删除 /home/tom、/var/spool/mail/tom。生产上删人前先确认有没有遗留文件要交接。

3.6 强制下线

pkill -KILL -u egon     # 杀掉该用户所有进程

四、组管理

命令 作用 示例
groupadd 组名 创建组 groupadd it
groupadd -g GID 组名 指定 GID groupadd -g 3000 it
groupmod -n 新名 旧名 改组名 groupmod -n sale salve
groupmod -g GID 组名 改 GID
groupdel 组名 删除组(没有 -r 选项) groupdel group1
gpasswd -a 用户 组 把用户加入组(附加组) gpasswd -a user01 it
gpasswd -d 用户 组 从组里移除用户 gpasswd -d user01 it
gpasswd -M 用户1,用户2 组 覆盖组成员列表 gpasswd -M user02,user03 it
gpasswd -A 用户 组 指定组管理员
groupadd it
useradd user01; useradd user02; useradd user03
gpasswd -a user01 it
gpasswd -M user02,user03 it
gpasswd -d user01 it

注意:groupdel 没有 -r 参数(有些笔记会写错)。组里还有用户作为主组时不能删,需要先改用户主组。

五、与用户组相关的文件

文件 存什么
/etc/passwd 用户信息(所有人可读)
/etc/shadow 密码哈希、有效期(只有 root 可读)
/etc/group 组信息
/etc/gshadow 组密码、组管理员
/etc/skel/ 新建用户时复制到家目录的模板(.bashrc 等)
/home/用户名 家目录
/var/spool/mail/用户名 邮箱文件
/etc/login.defs 默认 UID 范围、密码有效期、umask 等

5.1 /etc/passwd 七个字段

egon:x:1000:1000:测试账号:/home/egon:/bin/bash
 │   │  │    │      │        │          │
 │   │  │    │      │        │          └─ 登录 shell
 │   │  │    │      │        └──────────── 家目录
 │   │  │    │      └───────────────────── 描述(GECOS)
 │   │  │    └──────────────────────────── 主组 GID
 │   │  └───────────────────────────────── UID
 │   └──────────────────────────────────── 密码占位符(x 表示密码在 shadow)
 └──────────────────────────────────────── 用户名

5.2 /etc/shadow 九个字段

egon:$6$xxx:19000:0:99999:7:::
 │     │      │   │  │    │ └─ 保留
 │     │      │   │  │    └─── 过期前警告天数
 │     │      │   │  └──────── 密码最大有效期
 │     │      │   └─────────── 两次改密最小间隔
 │     │      └─────────────── 最后一次改密的天数(1970 起算)
 │     └────────────────────── 密码哈希(!! 表示未设密码/锁定)
 └──────────────────────────── 用户名

5.3 /etc/group 四个字段

it:x:3000:user01,user02
 │  │  │    └─ 组成员(附加组)
 │  │  └────── GID
 │  └───────── 组密码占位符
 └──────────── 组名

六、权限基础:rwx

6.1 三组权限

-rwxr-xr--. 1 root group1 31457280 4月 16 14:21 /tmp/a.txt
 │└┬┘└┬┘└┬┘
 │ │  │  └── 其他人 o:r--
 │ │  └───── 属组 g:r-x
 │ └──────── 属主 u:rwx
 └────────── 文件类型(- 普通文件,d 目录,l 链接)
权限 对文件 对目录
r 读 能看内容(cat) 能列出文件名(ls)
w 写 能改内容 能在目录里增删改名文件
x 执行 能作为程序执行 能进入目录(cd)、访问里面的文件

目录的 w 很危险:有 w 就能删目录里的文件,哪怕你没有那个文件的写权限。目录的 x 是访问里面内容的前提。

6.2 数字法

r=4、w=2、x=1,三组相加:

数字 权限 常见用途
777 rwxrwxrwx 全开(危险,别用)
755 rwxr-xr-x 目录、可执行程序
750 rwxr-x--- 私有目录
644 rw-r--r-- 普通文件、配置
600 rw------- 私钥、密码文件
400 r-------- 只读保护
chmod 755 /data
chmod 644 /etc/hosts
chmod -R 750 /data/app          # 递归

6.3 符号法

chmod u+x script.sh             # 属主加执行
chmod g-w file                  # 属组去掉写
chmod o=r file                  # 其他人只读(覆盖)
chmod u=rwx,g=rx,o= file        # o= 表示清空
chmod a+r file                  # 所有人加读(a = u+g+o)
chmod -R g+rX /data/share       # 目录加 x,文件不加(X 智能执行位)

6.4 改属主与属组

chown user file                 # 只改属主
chown user:group file           # 同时改属主和属组
chown :group file               # 只改属组
chown -R www:www /data/www      # 递归
chgrp group file                # 只改属组
chown --reference=/etc/passwd f # 参照另一个文件的属主属组

6.5 umask 默认权限

新建文件的默认权限 = 666 - umask,新建目录 = 777 - umask。

umask                # 查看,root 默认 022,普通用户常见 002
umask 027            # 临时修改
umask 新建文件 新建目录
022 644 755
002 664 775
027 640 750

永久修改写在 /etc/profile 或 ~/.bashrc,也可以改 /etc/login.defs 的 UMASK。

七、一个完整的权限场景

需求:/data/share 是 it 组的共享目录,组员可读写,其他人不可访问。

groupadd it
chown root:it /data/share
chmod 2770 /data/share       # 2 是 setgid,保证新建文件继承 it 组
usermod -a -G it user01

2770 里的 2(setgid)属于「特殊权限位」,下一节权限管理(下)会细讲;这里先知道它能保证目录里新文件自动属于 it 组。

速查表

# 用户
useradd -u 2000 -g it -G sale -s /sbin/nologin -d /abc lili
passwd lili; usermod -a -G dev lili; userdel -r lili
id lili; groups lili; who; whoami; w; last
pkill -KILL -u lili

# 组
groupadd it; groupmod -n sale salve; groupdel it
gpasswd -a user01 it; gpasswd -d user01 it; gpasswd -M u2,u3 it

# 文件
cat /etc/passwd; cat /etc/group; cat /etc/shadow

# 权限
ls -l; stat file
chmod 644 f; chmod -R 750 dir; chmod u+x f; chmod a+r f
chown user:group f; chown -R www:www dir; chgrp it f
umask; umask 027

常见坑

  1. usermod -G group2 lili 会覆盖原有附加组,想追加必须 -a -G。
  2. groupdel -r 不存在,-r 是 userdel 的选项。
  3. userdel 不加 -r 会留下家目录和邮箱,UID 被复用后可能把旧文件权限“送给”新用户。
  4. useradd -d /abc 只改家目录路径,不会自动创建目录,要配 -m 或手动建。
  5. -g、-G 指定的组必须已存在,先 groupadd。
  6. 删组前先确认没有用户把它当主组,否则删不掉。
  7. 目录只有 r 没有 x,ls 能看到名字但进不去、也读不了里面的文件。
  8. chmod 777 图省事是安全事故的起点,按最小权限给。
  9. 改完组不要忘了让用户重新登录(或 newgrp)才能拿到新附加组。
  10. passwd --stdin 会把密码暴露在命令历史和进程列表里,脚本里谨慎使用。

练习(16 题)

先自己做,再点开答案核对 0 / 16 已查看

01

权限里的 u、g、o 分别指谁?进程操作文件时的匹配顺序是什么?

查看答案

u 是属主(文件归谁),g 是属组,o 是其他人。匹配顺序:先看是不是属主,是就用属主权限;否则看是否属于属组,是就用属组权限;都不是才用其他人权限。匹配到即停止,不取并集。

02

rwxr-xr-- 对应的数字权限是多少?

查看答案

rwx=7、r-x=5、r--=4,所以是 754。

03

写出创建用户 lili 的命令:UID 2000、主组 it、附加组 sale、shell 为 /sbin/nologin、家目录 /abc。

查看答案
groupadd it; groupadd sale
useradd lili -u 2000 -g it -G sale -s /sbin/nologin -d /abc -m
04

给已存在的用户 lili 追加附加组 dev,命令怎么写?

查看答案
usermod -a -G dev lili

不加 -a 会覆盖掉原来的附加组。

05

删除用户 tom 并同时删除家目录和邮箱。

查看答案
userdel -r tom
06

查看 egon 的 UID、GID 和所有组,各用什么命令?

查看答案
id egon
groups egon
07

把 user01 加入 it 组,再把它从 it 组移除。

查看答案
gpasswd -a user01 it
gpasswd -d user01 it
08

创建组 it 并指定 GID 3000。

查看答案
groupadd -g 3000 it
09

把组 salve 改名为 sale。

查看答案
groupmod -n sale salve
10

/etc/passwd 的七个字段分别是什么?

查看答案

用户名、密码占位符(x)、UID、GID(主组)、描述、家目录、登录 shell。

11

为什么 /etc/shadow 只有 root 能读?

查看答案

里面存的是密码哈希和有效期,泄露后可被离线暴力破解,所以权限设为 000(root 可读),普通用户通过 PAM 间接校验。

12

给 /data/app 目录及里面所有内容设置 750 权限,属主属组改为 www:www。

查看答案
chown -R www:www /data/app
chmod -R 750 /data/app

先改属主再改权限,避免中间状态出问题。

13

目录的 r、w、x 分别能做什么?只有 w 没有 x 会怎样?

查看答案

r 能列出目录里的文件名;w 能在目录里创建、删除、重命名文件;x 能进入目录并访问里面文件的内容。只有 w 没有 x 时,虽然能在目录里建文件(依赖写权限),但无法 cd 进去,也无法读取目录中文件的内容。

14

root 用户的 UID 是多少?系统用户和普通用户的 UID 范围大致怎么分?

查看答案

root 的 UID 是 0;系统用户大致 1–999;普通用户从 1000 开始。

15

umask 为 027 时,新建文件和新建目录的默认权限分别是多少?

查看答案

文件 666-027=640(rw-r-----),目录 777-027=750(rwxr-x---)。

16

一个目录权限是 drwxr-x---,属主 alice、属组 it。用户 bob 属于 it 组,他能进入这个目录吗?能列出文件吗?

查看答案

能进入(x 对属组开放),也能列出目录(r 对属组开放);但不能在目录里创建或删除文件,因为没有 w。

用户、组与权限 · 生成于 2026-10-26 00:46