在 Linux 系统中,文件与目录的访问控制由两个核心概念共同决定:权限 和 属组。很多初学者甚至经验丰富的运维人员,都会将它们混为一谈,认为“权限”包含了“属组”。其实,它们分工明确,各司其职。今天我们就来彻底理清这两者的区别,以及它们对系统安全和日常运维的影响。
一、先搞懂三个基本角色
Linux 对每个文件都定义了三种角色:
而我们常说的“权限”,就是为这三个角色分别设置的访问规则。
二、权限(Permission)—— 能做什么?
权限由三个字母表示:**r(读)、w(写)、x(执行)**,分别对应三类角色。
权限的表示方法
- 符号法
- 后面三组
rw-、r--、r-- 分别对应所有者、组、其他
- 数字法
rw-r--r-- = 4+2=6(所有者),4(组),4(其他)→ 644
影响:权限直接决定了用户能否读、写、执行某个文件。比如配置文件设为 600 只有所有者可读写,敏感数据不会被他人窥探;而可执行脚本必须加上 x 才能运行。
三、属组(Group)—— 谁享有组权限?
属组 是文件所关联的一个用户组,它决定了哪些用户能够享受文件权限中“组”那一栏的权限。
举例:
bash
$ ls -l project.txt
-rw-rw---- 1 alice developers 1024 Mar 25 10:00 project.txt
此时,任何属于 developers 组的用户(如 bob)都可以读写这个文件,而其他用户(如 charlie)则完全无权访问。
属组的影响
- 多用户协作
将团队成员加入同一个组,并把共享目录的属组设为该组,即可轻松实现文件共享,无需为每个用户单独授权。 - SGID 位
如果目录设置了 SGID(chmod g+s),新创建的文件会自动继承该目录的属组,而不是创建者的主组。这在团队项目目录中非常实用。 - 可执行文件的 SGID
当可执行文件设置了 SGID,任何用户运行它时,进程将获得该文件属组的权限,从而可以访问该组拥有的资源。 - 日志管理等系统服务
系统日志文件通常属组为 adm 或 systemd-journal,只有这些组的成员才能读取日志。如果属组被意外修改,可能导致日志轮转失败或监控工具无法读取。
四、属组 vs 权限:核心区别
| | |
|---|
| 定义 | | |
| 作用对象 | | |
| 表现形式 | rwx | |
| 查看方式 | ls -l | ls -l |
| 修改命令 | chmod | chgrp |
| 影响范围 | | |
简单来说:权限 定义了“可以做什么”,属组 定义了“谁可以做”。
五、如何查看文件的属组?
1. ls -l 直接查看
bash
$ ls -l myfile
-rw-r--r-- 1 alice developers 1024 Mar 25 10:00 myfile
第 4 列 developers 就是属组。
2. stat 查看详细信息
$ stat myfile
File: myfile
Size: 1024 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 123456 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ alice) Gid: ( 1001/developers)
Gid 后面的括号里就是属组名称。
3. ls -n 查看数字 GID
bash
$ ls -n myfile
-rw-r--r-- 1 1000 1001 1024 Mar 25 10:00 myfile
第 4 列 1001 是属组的数字 ID,可通过 getent group 1001 反查组名。
六、实战场景:属组与权限如何影响你
场景 1:日志文件无限制增长
系统日志轮转失败,往往是因为日志文件属组被改成了普通用户组,导致 logrotate 无法正常移动、压缩旧日志。属组错误 让日志管理机制失效,即使权限为 644 也无济于事。
场景 2:团队协作项目
项目目录 /data/project,属组设为 dev_team,权限 2770(SGID + 组读写执行)。团队成员加入 dev_team 后,都能在此目录下创建、修改文件,且新文件自动继承 dev_team 属组,实现无缝协作。
场景 3:敏感配置文件
/etc/shadow 权限为 000,属组 root,其他用户根本无法读取。即使某个用户属于 root 组,也无法访问——因为组权限为 ---。这里权限起决定性作用。
七、总结
- 权限
- 两者相辅相成,共同构成 Linux 的访问控制模型。
- 理解属组和权限的区别,是解决权限问题、保障系统安全、实现团队协作的基础。
- 查看属组用
ls -l,修改属组用 chgrp 或 chown。
下次当你遇到“Permission denied”时,不妨先用 ls -l 看看属组对不对,再检查权限是否合理——很多问题都出在这两点的配合上。