一、引言:Linux 的权限到底在管理什么?
在 Linux 中,我们经常使用 ls -l 查看文件,使用 chmod 修改权限,使用 chown 修改文件所有者。
这些命令看起来并不复杂,但如果只记住命令的使用方法,就很容易在实际操作中遇到问题。
例如:
- 为什么一个文件的权限是
-rw-r--r--? chmod 755中的三个数字分别代表什么?- 为什么一个文件没有写权限,却仍然可能被删除?
- 为什么对目录来说,
r、w、x的含义与普通文件不同? - 为什么创建文件时,系统给出的默认权限并不是简单的
666?
这些问题的背后,其实都指向同一个核心:Linux 如何判断一个用户是否有权执行某项操作?
理解权限,不能只记忆字母和数字,还需要理解权限的判断对象、权限的修改方式,以及文件和目录在权限语义上的区别。
二、认识文件属性:ls -l 到底告诉了我们什么?
先在 Linux 终端中执行:
bash
ls -l
我们可能看到类似这样的输出:
text
-rw-r--r-- 1 ubuntu ubuntu 120 Oct 19 16:00 test.txt
这行内容包含了文件类型、权限、硬链接数量、所有者、所属组、文件大小、修改时间和文件名等信息。
其中,本篇重点关注前面的文件类型与权限,以及后面的所有者和所属组。
2.1 文件类型与权限位
先把最前面的字符拆开:
text
-rw-r--r--
可以将它理解为:
text
- | rw- | r-- | r--
所有者 所属组 其他用户
更准确地说,第一个字符表示文件类型,后面九个字符表示三类访问者各自拥有的权限。
第一个字符常见的含义如下:
| 符号 | 含义 |
|---|---|
- |
普通文件 |
d |
目录 |
l |
符号链接 |
b |
块设备文件 |
c |
字符设备文件 |
p |
管道文件 |
s |
套接字文件 |
因此,不能把 ls -l 输出开头的十个字符全部当作权限位。第一个字符表示类型,后面九个才是我们通常讨论的访问权限。
如果想进一步判断文件的实际类型,还可以使用:
bash
file test.txt
file 命令会根据文件内容等信息尝试识别文件类型。它与 ls -l 开头的类型字符不是同一套判断方式,不能简单地将两者等同。
2.2 Linux 如何划分文件访问者?
Linux 权限管理中,课件将访问者划分为三类:
u:User,文件所有者。g:Group,文件所属组中的用户。o:Others,其他用户。
此外,a 表示所有类别,即 u、g 和 o。
假设文件信息如下:
text
-rw-r----- 1 alice dev 120 Oct 19 16:00 test.txt
可以理解为:
- 文件所有者是
alice。 - 文件所属组是
dev。 - 所有者拥有
rw-权限。 - 所属组拥有
r--权限。 - 其他用户没有任何基本权限。
这里需要区分两个概念:所有者和所属组描述的是文件归属关系,rwx 描述的则是相应访问者被授予的操作权限。
Linux 在判断访问权限时,会根据访问者与文件的所有权关系,选择相应的权限类别。实际访问还可能受到目录路径权限、ACL 等机制影响,本篇先聚焦基础权限模型。
三、理解基本权限:rwx 对文件和目录分别意味着什么?
Linux 的三种基本权限是 r、w、x。
它们分别对应读取、写入和执行,但要注意:同一个权限字符,作用在普通文件和目录上时,含义并不完全相同。
3.1 普通文件的权限
对于普通文件:
r(Read):读取文件内容。w(Write):修改文件内容。x(Execute):将文件作为程序执行,前提是文件本身确实可以执行,且其他执行条件也满足。-:不具备对应权限。
例如:
text
-rw-r--r--
所有者具有读取和写入权限,所属组与其他用户只有读取权限。
这意味着,按照基础权限模型,所有者可以读取和修改文件内容,而另外两类访问者只能读取。
3.2 目录的权限
目录不能简单理解成一个装着文件内容的普通文件。它承担着组织文件名与目录项等信息的作用,因此目录的权限有不同的语义。
对于目录:
r:读取目录中的名称列表,例如查看其中有哪些文件。w:修改目录项,例如创建、删除或重命名其中的条目;通常还需要配合x才能完成相关操作。x:搜索或遍历目录,允许用户通过目录访问其中的具体条目;它也是进入目录以及访问路径的重要条件。
这里最容易混淆的是 w。
普通文件的 w 主要意味着可以修改文件内容;目录的 w 则主要涉及对目录项的修改。目录项记录了目录中名称与对应文件对象之间的关系。
所以,删除一个文件与修改这个文件的内容,并不是同一件事。
3.3 为什么没有文件写权限,也可能删除文件?
假设 /home/shared 是一个目录,里面有一个由 Alice 创建的 report.txt。
现在,Bob 没有 report.txt 的写权限,但他对 /home/shared 具有相应的目录写入和搜索权限。
那么,在没有其他限制的情况下,Bob 仍然可能删除 report.txt。
原因是:删除文件主要涉及修改父目录中的目录项,而不是修改文件自身的内容。
可以用下面的关系理解:
#mermaid-svg-S2PTfV6BO788koPr{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-S2PTfV6BO788koPr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-S2PTfV6BO788koPr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-S2PTfV6BO788koPr .error-icon{fill:#552222;}#mermaid-svg-S2PTfV6BO788koPr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-S2PTfV6BO788koPr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-S2PTfV6BO788koPr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-S2PTfV6BO788koPr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-S2PTfV6BO788koPr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-S2PTfV6BO788koPr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-S2PTfV6BO788koPr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-S2PTfV6BO788koPr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-S2PTfV6BO788koPr .marker.cross{stroke:#333333;}#mermaid-svg-S2PTfV6BO788koPr svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-S2PTfV6BO788koPr p{margin:0;}#mermaid-svg-S2PTfV6BO788koPr .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-S2PTfV6BO788koPr .cluster-label text{fill:#333;}#mermaid-svg-S2PTfV6BO788koPr .cluster-label span{color:#333;}#mermaid-svg-S2PTfV6BO788koPr .cluster-label span p{background-color:transparent;}#mermaid-svg-S2PTfV6BO788koPr .label text,#mermaid-svg-S2PTfV6BO788koPr span{fill:#333;color:#333;}#mermaid-svg-S2PTfV6BO788koPr .node rect,#mermaid-svg-S2PTfV6BO788koPr .node circle,#mermaid-svg-S2PTfV6BO788koPr .node ellipse,#mermaid-svg-S2PTfV6BO788koPr .node polygon,#mermaid-svg-S2PTfV6BO788koPr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-S2PTfV6BO788koPr .rough-node .label text,#mermaid-svg-S2PTfV6BO788koPr .node .label text,#mermaid-svg-S2PTfV6BO788koPr .image-shape .label,#mermaid-svg-S2PTfV6BO788koPr .icon-shape .label{text-anchor:middle;}#mermaid-svg-S2PTfV6BO788koPr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-S2PTfV6BO788koPr .rough-node .label,#mermaid-svg-S2PTfV6BO788koPr .node .label,#mermaid-svg-S2PTfV6BO788koPr .image-shape .label,#mermaid-svg-S2PTfV6BO788koPr .icon-shape .label{text-align:center;}#mermaid-svg-S2PTfV6BO788koPr .node.clickable{cursor:pointer;}#mermaid-svg-S2PTfV6BO788koPr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-S2PTfV6BO788koPr .arrowheadPath{fill:#333333;}#mermaid-svg-S2PTfV6BO788koPr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-S2PTfV6BO788koPr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-S2PTfV6BO788koPr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-S2PTfV6BO788koPr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-S2PTfV6BO788koPr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-S2PTfV6BO788koPr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-S2PTfV6BO788koPr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-S2PTfV6BO788koPr .cluster text{fill:#333;}#mermaid-svg-S2PTfV6BO788koPr .cluster span{color:#333;}#mermaid-svg-S2PTfV6BO788koPr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-S2PTfV6BO788koPr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-S2PTfV6BO788koPr rect.text{fill:none;stroke-width:0;}#mermaid-svg-S2PTfV6BO788koPr .icon-shape,#mermaid-svg-S2PTfV6BO788koPr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-S2PTfV6BO788koPr .icon-shape p,#mermaid-svg-S2PTfV6BO788koPr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-S2PTfV6BO788koPr .icon-shape .label rect,#mermaid-svg-S2PTfV6BO788koPr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-S2PTfV6BO788koPr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-S2PTfV6BO788koPr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-S2PTfV6BO788koPr :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 删除 report.txt
修改父目录中的目录项
检查父目录权限
同时考虑其他访问限制
判断操作是否允许
这也解释了为什么 Linux 不能只检查被删除文件本身的写权限。
当然,实际结果还可能受到目录权限、粘滞位、ACL、只读挂载等因素影响。因此,这里讲的是基础权限模型下的判断逻辑。
四、两种权限表示方式:字符与八进制数字
Linux 可以使用字符形式和八进制数字形式来表示权限。两种形式表达的是同一套基础权限,只是写法不同。
4.1 字符形式
例如:
bash
chmod u+w test.txt
chmod o-x test.txt
chmod a=r test.txt
其中:
u:所有者。g:所属组。o:其他用户。a:所有类别。+:增加指定权限。-:移除指定权限。=:将指定类别的权限设置为给定的权限集合。
逐条理解:
bash
chmod u+w test.txt
给文件所有者增加写权限,不会因为这条命令就把其他类别的权限一起改掉。
bash
chmod o-x test.txt
移除其他用户的执行权限。
bash
chmod a=r test.txt
将所有类别的基本权限设置为只读,也就是清除这些类别原先具有的其他基本权限。
字符形式的优势在于表达意图清晰:我们可以明确指定修改哪一类访问者,以及增加、删除还是重新设置权限。
4.2 八进制数字形式
数字形式的关键在于三个基本权限分别对应一个数值:
| 权限 | 数值 | 二进制表示 |
|---|---|---|
r |
4 | 100 |
w |
2 | 010 |
x |
1 | 001 |
- |
0 | 000 |
每一类访问者的权限都可以用三个二进制位表示。
例如:
text
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 = 6
r-x = 4 + 1 = 5
r-- = 4 = 4
这不是随意规定的数字对应关系,而是利用二进制位来表示权限组合:读取、写入和执行分别由不同的位表示。
因此,每一类访问者的权限值都可以通过把相应的数值相加得到。
4.3 为什么 chmod 755 表示 rwxr-xr-x?
三个数字分别对应所有者、所属组和其他用户。
text
755
││└── 其他用户:5 = 4 + 1 = r-x
│└─── 所属组: 5 = 4 + 1 = r-x
└──── 所有者: 7 = 4 + 2 + 1 = rwx
所以:
bash
chmod 755 test.sh
对应的基础权限是:
text
-rwxr-xr-x
再看两个课件中的例子:
bash
chmod 664 /home/abc.txt
chmod 640 /home/abc.txt
664 对应:
text
rw-rw-r--
640 对应:
text
rw-r-----
注意,chmod 修改的是权限位,不会因此改变文件所有者或所属组。
另外,课件中使用的 chmod 0777 /home/,其中前面的 0 是八进制写法的常见标记;基础权限的三个数字仍然分别对应所有者、所属组和其他用户。
4.4 chmod -R 的作用
课件还介绍了递归修改权限的选项:
bash
chmod -R 755 mydir
-R 表示递归处理目录及其下的内容。
这条命令会尝试把 mydir 中的目录和文件都设置为 755。但要注意,目录和普通文件通常不应该机械地使用完全相同的权限设置:目录的执行权限关系到遍历,而普通文件的执行权限可能让文件可以被作为程序运行。
因此,使用递归修改权限时,应先明确目标目录中的文件类型和实际需求,避免把不需要执行权限的文件也统一设置为可执行。
此外,课件指出,通常只有文件所有者和 root 才能修改文件权限。
五、修改文件归属:chown 与 chgrp
前面介绍的 chmod 负责修改权限位。
但文件权限还有两个重要的归属信息:所有者和所属组。
如果我们希望修改文件的所有者或所属组,就需要使用其他命令。
5.1 chown:修改文件所有者
chown 的作用是修改文件的所有者。
课件中的基本格式为:
bash
chown 用户名 文件名
例如:
bash
chown user1 f1
这条命令用于将文件 f1 的所有者修改为 user1。实际执行时,当前用户必须具备相应权限,通常需要 root 权限或适当的授权。
递归修改可以使用:
bash
chown -R user1 filegroup1
其中 -R 表示递归处理目录及其下的内容。
5.2 chgrp:修改文件所属组
chgrp 用于修改文件或目录的所属组。
基本格式:
bash
chgrp 组名 文件名
例如:
bash
chgrp users /abc/f2
这条命令用于将 /abc/f2 的所属组修改为 users。
同样,递归修改可以使用 -R:
bash
chgrp -R users mydir
5.3 三个命令的职责区别
| 命令 | 主要修改内容 |
|---|---|
chmod |
文件的基本访问权限 |
chown |
文件的所有者 |
chgrp |
文件的所属组 |
它们分别管理不同的信息,不应该混为一谈。
例如,执行 chmod 640 test.txt 不会自动把文件所有者变成当前用户;执行 chown user1 test.txt 也不意味着文件的 rwx 权限一定会发生变化。
六、umask:为什么新建文件的权限不是 666?
课件还介绍了 umask,即文件权限掩码。
理解 umask,首先要区分两件事:
第一,创建文件或目录时使用的基础权限模式。
第二,系统根据当前的 umask 对这些权限进行限制后,最终得到的权限。
课件给出的基础模式是:
- 普通文件:
0666。 - 目录:
0777。
但这不意味着新建的每个文件最终都一定拥有 666,也不意味着每个目录最终都会拥有 777。
6.1 查看当前 umask
执行:
bash
umask
即可查看当前的权限掩码。
课件还给出了修改方式:
bash
umask 044
执行后,会把当前 shell 的 umask 设置为 044。这会影响随后由该 shell 中的程序创建文件或目录时所采用的默认权限限制。
6.2 umask 的基本计算思路
课件给出的计算关系是:
text
实际创建权限 = 基础权限 & ~umask
这里的 & 是按位与,~ 表示按位取反。实际计算时,需要按照权限位来理解,而不是把几个十进制数字直接做普通算术减法。
例如,在常见的 umask 022 情况下:
普通文件的基础权限为 666,应用掩码后通常得到 644。
目录的基础权限为 777,应用掩码后通常得到 755。
对应关系可以写成:
text
普通文件:666 → 644
目录: 777 → 755
需要注意,实际创建权限还会受到程序创建文件时指定的模式等因素影响。umask 是权限限制机制,不是直接给每个文件指定固定权限的命令。
6.3 为什么要有 umask?
可以把 umask 理解为创建文件时的一道默认权限限制。
系统不希望每次创建文件都默认开放所有可能的权限,因此会通过 umask 对基础权限模式进行限制。
这样,新建文件或目录时就可以默认排除某些权限,减少不必要的访问。
七、目录权限的实际判断:把 r、w、x 放在一起理解
回到前面的核心问题:为什么目录的权限会影响文件操作?
假设有这样一个目录:
text
/home/shared/
其中包含:
text
/home/shared/report.txt
访问 report.txt 时,系统不仅需要考虑 report.txt 本身的权限,还需要考虑沿途目录是否允许用户搜索和遍历。
如果用户没有某一级目录所需的 x 权限,即使知道文件的完整路径,也可能无法正常访问该文件。
课件对目录权限的总结可以概括为:
- 目录没有
x权限时,用户无法正常进入或遍历目录。 - 目录没有
r权限时,用户可能无法列出目录中的文件名,但如果拥有x权限,仍可能在知道具体名称的情况下访问特定条目。 - 目录没有
w权限时,用户通常不能通过修改该目录项来创建、删除或重命名其中的条目。
可以通过下面的流程理解一次访问判断:
#mermaid-svg-IIYqDkR0pahoE0zC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IIYqDkR0pahoE0zC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IIYqDkR0pahoE0zC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IIYqDkR0pahoE0zC .error-icon{fill:#552222;}#mermaid-svg-IIYqDkR0pahoE0zC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IIYqDkR0pahoE0zC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IIYqDkR0pahoE0zC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IIYqDkR0pahoE0zC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IIYqDkR0pahoE0zC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IIYqDkR0pahoE0zC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IIYqDkR0pahoE0zC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IIYqDkR0pahoE0zC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IIYqDkR0pahoE0zC .marker.cross{stroke:#333333;}#mermaid-svg-IIYqDkR0pahoE0zC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IIYqDkR0pahoE0zC p{margin:0;}#mermaid-svg-IIYqDkR0pahoE0zC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IIYqDkR0pahoE0zC .cluster-label text{fill:#333;}#mermaid-svg-IIYqDkR0pahoE0zC .cluster-label span{color:#333;}#mermaid-svg-IIYqDkR0pahoE0zC .cluster-label span p{background-color:transparent;}#mermaid-svg-IIYqDkR0pahoE0zC .label text,#mermaid-svg-IIYqDkR0pahoE0zC span{fill:#333;color:#333;}#mermaid-svg-IIYqDkR0pahoE0zC .node rect,#mermaid-svg-IIYqDkR0pahoE0zC .node circle,#mermaid-svg-IIYqDkR0pahoE0zC .node ellipse,#mermaid-svg-IIYqDkR0pahoE0zC .node polygon,#mermaid-svg-IIYqDkR0pahoE0zC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IIYqDkR0pahoE0zC .rough-node .label text,#mermaid-svg-IIYqDkR0pahoE0zC .node .label text,#mermaid-svg-IIYqDkR0pahoE0zC .image-shape .label,#mermaid-svg-IIYqDkR0pahoE0zC .icon-shape .label{text-anchor:middle;}#mermaid-svg-IIYqDkR0pahoE0zC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IIYqDkR0pahoE0zC .rough-node .label,#mermaid-svg-IIYqDkR0pahoE0zC .node .label,#mermaid-svg-IIYqDkR0pahoE0zC .image-shape .label,#mermaid-svg-IIYqDkR0pahoE0zC .icon-shape .label{text-align:center;}#mermaid-svg-IIYqDkR0pahoE0zC .node.clickable{cursor:pointer;}#mermaid-svg-IIYqDkR0pahoE0zC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IIYqDkR0pahoE0zC .arrowheadPath{fill:#333333;}#mermaid-svg-IIYqDkR0pahoE0zC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IIYqDkR0pahoE0zC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IIYqDkR0pahoE0zC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IIYqDkR0pahoE0zC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IIYqDkR0pahoE0zC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IIYqDkR0pahoE0zC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IIYqDkR0pahoE0zC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IIYqDkR0pahoE0zC .cluster text{fill:#333;}#mermaid-svg-IIYqDkR0pahoE0zC .cluster span{color:#333;}#mermaid-svg-IIYqDkR0pahoE0zC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IIYqDkR0pahoE0zC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IIYqDkR0pahoE0zC rect.text{fill:none;stroke-width:0;}#mermaid-svg-IIYqDkR0pahoE0zC .icon-shape,#mermaid-svg-IIYqDkR0pahoE0zC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IIYqDkR0pahoE0zC .icon-shape p,#mermaid-svg-IIYqDkR0pahoE0zC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IIYqDkR0pahoE0zC .icon-shape .label rect,#mermaid-svg-IIYqDkR0pahoE0zC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IIYqDkR0pahoE0zC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IIYqDkR0pahoE0zC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IIYqDkR0pahoE0zC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
否
是
用户请求访问文件
检查路径中的目录权限
是否允许搜索和遍历?
访问失败
检查目标文件的访问权限
是否满足操作要求?
访问失败
继续执行操作
这是一种用于理解基础权限模型的简化流程。Linux 实际访问控制还可能涉及 ACL、进程凭据、特殊权限位、挂载选项等机制。
7.1 目录写权限与文件删除
再强调一次:目录写权限与文件写权限并不相同。
假设 Bob 对 /home/shared 拥有相应的目录写权限和搜索权限,但没有 report.txt 的写权限。
在没有其他限制时,Bob 仍可能删除这个文件,因为删除动作主要改变的是父目录中的目录项。
这也是为什么 Linux 需要考虑目录自身的访问权限,而不是只检查文件自身的权限位。
7.2 粘滞位:共享目录中的额外限制
课件最后还介绍了粘滞位(sticky bit),并将其标记为选学内容。
例如:
bash
chmod +t /home/
设置粘滞位后,可以使用:
bash
ls -ld /home/
观察目录权限字符串末尾是否出现 t。
在典型的共享目录场景中,粘滞位可以限制普通用户删除或重命名目录中的其他用户文件。通常,能够进行这类操作的包括文件所有者、目录所有者以及具有相应特权的管理员。
它解决的是一个典型问题:即使一个目录允许多个用户创建和删除文件,也不代表每个用户都应该可以随意删除其他用户的文件。
粘滞位是在基础目录权限之上增加的一项限制,不应将它与普通的 rwx 权限混为一谈。
八、总结:理解权限,需要建立怎样的知识链?
Linux 权限不是孤立的几个字母,而是一套用于管理访问行为的机制。
本篇可以归纳为以下知识链:
第一,使用 ls -l 观察文件类型、所有者、所属组和基本权限。
第二,理解 u、g、o 三类访问者,以及 r、w、x 在普通文件和目录上的不同含义。
第三,掌握 chmod 的字符形式与八进制数字形式,理解 755、644 等权限组合的来源。
第四,区分 chmod、chown 和 chgrp 的职责:修改权限、修改所有者、修改所属组。
第五,理解 umask 如何影响新建文件和目录的默认权限。
第六,认识目录权限与文件权限之间的关系,理解为什么删除文件不等同于修改文件内容,并初步了解粘滞位的作用。
真正理解这些内容之后,遇到权限问题时,就不必只靠试命令来解决,而是可以从访问者身份、目标对象、权限类别和路径目录等方面逐步分析。
这也是学习 Linux 权限最重要的目标:不只会修改权限,还要能解释系统为什么允许或拒绝一次操作。