一句话总结:用户是员工、组是部门、权限是门禁卡——进程以某个用户身份运行,操作文件时按“属主 → 属组 → 其他人”依次匹配。 适用:Rocky Linux / CentOS 9,UID/GID 规则以 RHEL 系为准。
一、为什么需要用户和组
把系统想成一家公司:
| 概念 | 类比 | 说明 |
|---|---|---|
| 用户 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
常见坑
usermod -G group2 lili会覆盖原有附加组,想追加必须-a -G。groupdel -r不存在,-r是userdel的选项。userdel不加-r会留下家目录和邮箱,UID 被复用后可能把旧文件权限“送给”新用户。useradd -d /abc只改家目录路径,不会自动创建目录,要配-m或手动建。-g、-G指定的组必须已存在,先groupadd。- 删组前先确认没有用户把它当主组,否则删不掉。
- 目录只有
r没有x,ls能看到名字但进不去、也读不了里面的文件。 chmod 777图省事是安全事故的起点,按最小权限给。- 改完组不要忘了让用户重新登录(或
newgrp)才能拿到新附加组。 passwd --stdin会把密码暴露在命令历史和进程列表里,脚本里谨慎使用。
练习(16 题)
- 权限里的 u、g、o 分别指谁?进程操作文件时的匹配顺序是什么?
rwxr-xr--对应的数字权限是多少?- 写出创建用户
lili的命令:UID 2000、主组it、附加组sale、shell 为/sbin/nologin、家目录/abc。 - 给已存在的用户
lili追加附加组dev,命令怎么写? - 删除用户
tom并同时删除家目录和邮箱。 - 查看
egon的 UID、GID 和所有组,各用什么命令? - 把
user01加入it组,再把它从it组移除。 - 创建组
it并指定 GID 3000。 - 把组
salve改名为sale。 /etc/passwd的七个字段分别是什么?- 为什么
/etc/shadow只有 root 能读? - 给
/data/app目录及里面所有内容设置750权限,属主属组改为www:www。 - 目录的
r、w、x分别能做什么?只有w没有x会怎样? - root 用户的 UID 是多少?系统用户和普通用户的 UID 范围大致怎么分?
- umask 为 027 时,新建文件和新建目录的默认权限分别是多少?
- 一个目录权限是
drwxr-x---,属主alice、属组it。用户bob属于it组,他能进入这个目录吗?能列出文件吗?
答案与解析
1.
u 是属主(文件归谁),g 是属组,o 是其他人。匹配顺序:先看是不是属主,是就用属主权限;否则看是否属于属组,是就用属组权限;都不是才用其他人权限。匹配到即停止,不取并集。
2.
rwx=7、r-x=5、r--=4,所以是 754。
3.
groupadd it; groupadd sale
useradd lili -u 2000 -g it -G sale -s /sbin/nologin -d /abc -m
4.
usermod -a -G dev lili
不加
-a会覆盖掉原来的附加组。
5.
userdel -r tom
6.
id egon
groups egon
7.
gpasswd -a user01 it
gpasswd -d user01 it
8.
groupadd -g 3000 it
9.
groupmod -n sale salve
10.
用户名、密码占位符(x)、UID、GID(主组)、描述、家目录、登录 shell。
11.
里面存的是密码哈希和有效期,泄露后可被离线暴力破解,所以权限设为
000(root 可读),普通用户通过 PAM 间接校验。
12.
chown -R www:www /data/app
chmod -R 750 /data/app
先改属主再改权限,避免中间状态出问题。
13.
r能列出目录里的文件名;w能在目录里创建、删除、重命名文件;x能进入目录并访问里面文件的内容。只有w没有x时,虽然能在目录里建文件(依赖写权限),但无法 cd 进去,也无法读取目录中文件的内容。
14.
root 的 UID 是 0;系统用户大致 1–999;普通用户从 1000 开始。
15.
文件 666-027=640(rw-r-----),目录 777-027=750(rwxr-x---)。
16.
能进入(
x对属组开放),也能列出目录(r对属组开放);但不能在目录里创建或删除文件,因为没有w。