【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑

一、引言: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 权限最重要的目标:不只会修改权限,还要能解释系统为什么允许或拒绝一次操作。

相关推荐
system_error_x37 分钟前
C++ 编程基础入门教程
开发语言·c++
远离UE442 分钟前
半拉格朗日学习笔记 动力学 实时渲染
人工智能·算法
小郎君6581 小时前
MPTT 不是万能编号:一棵百万节点树的增删改与批量事务
算法
FPGA小徐1 小时前
【一生一芯 / PA】AM 核心文件逐行解析(上):从 start.S 到 gpu.c
前端·算法
深圳老胡1 小时前
STM32CubeMX 2 与 STM32CubeMX 的主要区别
笔记·stm32·单片机·代码规范
Tairitsu_H2 小时前
[动态规划#1] 子数组 | 最大子数组和 | 环形子数组的最大和 | 乘积最大子数组 | 乘积为正数的最长子数组
算法·动态规划
Lsetea2 小时前
curl下载HTTPS文件报23:证书验证成功与本地写入失败分层排查
linux·https·shell·ssl证书·curl
云计算练习生2 小时前
什么是文件权限?Linux 中 rwx 与数字权限的对应关系
linux·运维·服务器·操作系统·文件权限管理
fanged2 小时前
嵌入式架构学习6--ZSWatch(TODO)
学习