从零开始理解Linux权限模型
权限三要素:用户、组、其他
在Linux文件系统中,每个文件和目录都绑定三个权限域:拥有者(用户)、所属组,以及其他人。这三类主体分别拥有对文件的读取、写入和执行权,形成了基本的权限模型。理解这三类主体的关系,是进行后续权限设置的前提。
权限位的作用是对这三类主体授予或限制访问能力,通过读、写、执行这三种基本操作来表达。新手需要将“谁可以做什么”和“在哪些场景下允许操作”这两点结合起来考虑。
常见的权限显示形式是类似 drwxr-x--- 的字符串,第一位表示文件类型(d 表示目录,- 表示普通文件),接下来的三组分别对应拥有者、组和其他人的权限。理解这三组权限位是快速判断访问控制最直接的方式。
权限位的三种类型:读、写、执行
r(read) 代表读取权限,允许查看文件内容或列出目录;w(write) 代表写权限,允许修改文件或在目录中创建/删除条目;x(execute) 代表执行权限,允许执行程序或进入目录。对于目录而言,执行权限还意味着可以进入该目录并访问其子项。
在日常使用中,新的目录通常需要所有者有读/写/执行权限,而其他人可能只需要读取目录结构或完全禁止访问。通过理解这三个基本权限,可以更准确地分配工作角色和访问控制。
示例:一个目录的权限表示为 drwxr-x---,说明拥有者拥有全部权限,所属组有读取与执行权限,其他人无权访问。这个差异化的权限设计有助于保护敏感数据,同时保持必要的协作能力。
查看与分析文件权限的常用命令
ls -l 的输出解读
查看权限最常用的命令是 ls -l,它会以长列表形式显示权限、所有者、所属组、大小与时间等信息。权限字段是左侧的十个字符,如 drwxr-x---,其中首位表示文件类型,接着三组分别对应拥有者、组、其他人的权限。
示例输出中,第一列的 d 表示目录,若是 - 则表示普通文件;随后三组 r、w、x 的组合决定了谁具备哪些操作。理解 owner、group、others 的出处和用途,是后续操作的基础。
$ ls -l /home
drwx------ 5 alice staff 4096 Jun 14 10:15 alice
drwxr-xr-x 4 root root 4096 Jun 12 18:22 shared
在以上示例中,只有 alice 拥有该目录的完整权限,其他用户需要通过组或 ACL 来获得额外权限。结合 ls -l 的输出,可以快速判断当前权限状态。
getfacl 与 setfacl 的基础用法
除了传统的三类主体权限,Linux 还支持 ACL(访问控制列表),允许为单独的用户或组分配额外权限。getfacl 可以查看 ACL,setfacl 用于设置 ACL。
为了简单演示,先查看一个文件的 ACL:若没有显式设置,输出通常只包含三类主体权限信息;若存在 ACL,将会看到额外的条目。
$ getfacl /var/www/index.html
# file: /var/www/index.html
# owner: root
# group: root
user::rw-
group::r--
other::---
若需要给某个用户额外授权,可以使用 setfacl:例如为用户 alice 增加读写权限:setfacl -m u:alice:rw /var/www/index.html,并且可以继续使用 getfacl 验证结果。
基本权限操作:修改权限、所有者与群组
使用 chmod 改变权限
最常见的权限修改方式是 chmod,它支持数值模式和符号模式两种写法。数值模式通常用 3 位或 4 位八进制数表示(如 755、644),分别对应拥有者、组、其他人的权限组合。符号模式则通过 u、g、o、a 和 +、-、= 来逐项设置。

示例 1:给文件赋予拥有者可读写执行、组可读、其他人不可访问的权限:chmod 745 filename。示例 2:为拥有者追加执行权限:chmod u+x filename。
$ chmod 755 script.sh
$ ls -l script.sh
-rwxr-xr-x 1 user user 1234 Jun 14 12:00 script.sh
更改文件所有者与所属用户组
通过 chown,可以改变文件的所有者与所属组。若仅修改组,可以使用 user:group 的形式。chown 的常见用法包括将目录及其子项更改为新所有者(-R 递归选项)。
示例:chown alice:developers project/ 将 project 及其内容的所有者设为 alice、所属组设为 developers。
$ chown alice:developers project/
$ chown -R alice:developers project/
默认权限与新建文件/目录的权限计算
umask 的作用与设置
在创建新文件或目录时,系统会使用一个默认权限集,并通过 umask 来裁剪某些权限。umask 表示禁止位,最终赋予新对象的权限等于初始权限与 ~umask 的按位与结果。
例如,创建文件时初始权限是 666,目录初始权限是 777;若 umask 为 022,那么新文件实际权限为 644,新目录实际权限为 755。合理设置 umask 能提高系统的默认安全性。
$ umask
0022
$ umask 077
$ touch secret.txt
$ ls -l secret.txt
-rw------- 1 user user 0 Jun 14 12:20 secret.txt
理解 默认权限计算公式是新手快速掌握权限的关键。对于文件,最终权限 = 666 & ~umask;对于目录,最终权限 = 777 & ~umask。
高级权限:ACL与特殊位
ACL 的基础概念
ACL 允许对单个用户或特定组设置额外权限,超越传统的 owner/group/other 三域结构。ACL 能提供更细粒度的访问控制,适用于团队协作或多方参与的场景。
通过 getfacl 可以查看当前对象的 ACL,setfacl 则用于添加、修改或移除条目。通常先评估是否需要 ACL,避免过度复杂化。
例如为用户 bob 增加对 /var/data 的 rwx 权限:setfacl -m u:bob:rwx /var/data,随后可再次用 getfacl 验证结果。
$ getfacl /var/data
# file: /var/data
# owner: root
# group: root
user::rwx
group::r-x
other::---
user:bob:rwx
设置 ACL 的命令示例
常用的 ACL 设置包括:为特定用户/组添加权限、为默认目录设置默认 ACL、以及移除某些 ACL 条目。默认 ACL 可以确保新创建的子对象继承父目录的权限策略。
示例:为 group 工程组添加只读权限,并为默认目录设置同样的默认权限:setfacl -m g:engineering:rx /shared/projects,且在目录上设定默认 ACL:setfacl -d -m g:engineering:rx /shared/projects。
$ setfacl -m g:engineering:rx /shared/projects
$ setfacl -d -m g:engineering:rx /shared/projects
实战演练:从零开始的权限设置手把手
场景一:创建项目目录并设置权限
本场景模拟一个新项目的权限初始化过程。首先创建目录,然后设定合适的所有者、所属组以及权限,以确保开发者可以协同工作,同时保护生产数据。
步骤要点:创建目录、设置所有者与群组、应用合适的权限位,以及可选的默认 umask 配置。
# 创建项目目录
$ sudo mkdir -p /srv/project
# 设置拥有者与群组
$ sudo chown -R alice:devteam /srv/project
# 设置权限:拥有者可读写执行,组可读,其他人无访问
$ sudo chmod -R 750 /srv/project
# 查看效果
$ ls -ld /srv/project
drwxr-xr-x 2 alice devteam 4096 Jun 14 12:30 /srv/project
场景二:团队共享目录的 ACL 配置
当团队成员需要灵活的访问权限时,ACL 提供了更细的控制。为团队成员添加额外权限,并确保新创建的文件夹/文件能继承这些权限。
关键操作点:为指定用户/组添加权限、设置默认 ACL、验证结果。
# 为工程组添加读写权限给 /srv/project
$ sudo setfacl -m g:devteam:rwX /srv/project
# 设置默认 ACL,确保新建条目继承
$ sudo setfacl -d -m g:devteam:rwX /srv/project
# 验证 ACL
$ getfacl /srv/project


