【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑 一、引言Linux 的权限到底在管理什么在 Linux 中我们经常使用ls -l查看文件使用chmod修改权限使用chown修改文件所有者。这些命令看起来并不复杂但如果只记住命令的使用方法就很容易在实际操作中遇到问题。例如为什么一个文件的权限是-rw-r--r--chmod 755中的三个数字分别代表什么为什么一个文件没有写权限却仍然可能被删除为什么对目录来说r、w、x的含义与普通文件不同为什么创建文件时系统给出的默认权限并不是简单的666这些问题的背后其实都指向同一个核心Linux 如何判断一个用户是否有权执行某项操作理解权限不能只记忆字母和数字还需要理解权限的判断对象、权限的修改方式以及文件和目录在权限语义上的区别。二、认识文件属性ls -l到底告诉了我们什么先在 Linux 终端中执行ls-l我们可能看到类似这样的输出-rw-r--r-- 1 ubuntu ubuntu 120 Oct 19 16:00 test.txt这行内容包含了文件类型、权限、硬链接数量、所有者、所属组、文件大小、修改时间和文件名等信息。其中本篇重点关注前面的文件类型与权限以及后面的所有者和所属组。2.1 文件类型与权限位先把最前面的字符拆开-rw-r--r--可以将它理解为- | rw- | r-- | r-- 所有者 所属组 其他用户更准确地说第一个字符表示文件类型后面九个字符表示三类访问者各自拥有的权限。第一个字符常见的含义如下符号含义-普通文件d目录l符号链接b块设备文件c字符设备文件p管道文件s套接字文件因此不能把ls -l输出开头的十个字符全部当作权限位。第一个字符表示类型后面九个才是我们通常讨论的访问权限。如果想进一步判断文件的实际类型还可以使用filetest.txtfile命令会根据文件内容等信息尝试识别文件类型。它与ls -l开头的类型字符不是同一套判断方式不能简单地将两者等同。2.2 Linux 如何划分文件访问者Linux 权限管理中课件将访问者划分为三类uUser文件所有者。gGroup文件所属组中的用户。oOthers其他用户。此外a表示所有类别即u、g和o。假设文件信息如下-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 普通文件的权限对于普通文件rRead读取文件内容。wWrite修改文件内容。xExecute将文件作为程序执行前提是文件本身确实可以执行且其他执行条件也满足。-不具备对应权限。例如-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。原因是删除文件主要涉及修改父目录中的目录项而不是修改文件自身的内容。可以用下面的关系理解删除 report.txt修改父目录中的目录项检查父目录权限同时考虑其他访问限制判断操作是否允许这也解释了为什么 Linux 不能只检查被删除文件本身的写权限。当然实际结果还可能受到目录权限、粘滞位、ACL、只读挂载等因素影响。因此这里讲的是基础权限模型下的判断逻辑。四、两种权限表示方式字符与八进制数字Linux 可以使用字符形式和八进制数字形式来表示权限。两种形式表达的是同一套基础权限只是写法不同。4.1 字符形式例如chmoduw test.txtchmodo-x test.txtchmodar test.txt其中u所有者。g所属组。o其他用户。a所有类别。增加指定权限。-移除指定权限。将指定类别的权限设置为给定的权限集合。逐条理解chmoduw test.txt给文件所有者增加写权限不会因为这条命令就把其他类别的权限一起改掉。chmodo-x test.txt移除其他用户的执行权限。chmodar test.txt将所有类别的基本权限设置为只读也就是清除这些类别原先具有的其他基本权限。字符形式的优势在于表达意图清晰我们可以明确指定修改哪一类访问者以及增加、删除还是重新设置权限。4.2 八进制数字形式数字形式的关键在于三个基本权限分别对应一个数值权限数值二进制表示r4100w2010x1001-0000每一类访问者的权限都可以用三个二进制位表示。例如rwx 4 2 1 7 rw- 4 2 6 r-x 4 1 5 r-- 4 4这不是随意规定的数字对应关系而是利用二进制位来表示权限组合读取、写入和执行分别由不同的位表示。因此每一类访问者的权限值都可以通过把相应的数值相加得到。4.3 为什么chmod 755表示rwxr-xr-x三个数字分别对应所有者、所属组和其他用户。755 ││└── 其他用户5 4 1 r-x │└─── 所属组 5 4 1 r-x └──── 所有者 7 4 2 1 rwx所以chmod755test.sh对应的基础权限是-rwxr-xr-x再看两个课件中的例子chmod664/home/abc.txtchmod640/home/abc.txt664对应rw-rw-r--640对应rw-r-----注意chmod修改的是权限位不会因此改变文件所有者或所属组。另外课件中使用的chmod 0777 /home/其中前面的0是八进制写法的常见标记基础权限的三个数字仍然分别对应所有者、所属组和其他用户。4.4chmod -R的作用课件还介绍了递归修改权限的选项chmod-R755mydir-R表示递归处理目录及其下的内容。这条命令会尝试把mydir中的目录和文件都设置为755。但要注意目录和普通文件通常不应该机械地使用完全相同的权限设置目录的执行权限关系到遍历而普通文件的执行权限可能让文件可以被作为程序运行。因此使用递归修改权限时应先明确目标目录中的文件类型和实际需求避免把不需要执行权限的文件也统一设置为可执行。此外课件指出通常只有文件所有者和 root 才能修改文件权限。五、修改文件归属chown与chgrp前面介绍的chmod负责修改权限位。但文件权限还有两个重要的归属信息所有者和所属组。如果我们希望修改文件的所有者或所属组就需要使用其他命令。5.1chown修改文件所有者chown的作用是修改文件的所有者。课件中的基本格式为chown用户名 文件名例如chownuser1 f1这条命令用于将文件f1的所有者修改为user1。实际执行时当前用户必须具备相应权限通常需要 root 权限或适当的授权。递归修改可以使用chown-Ruser1 filegroup1其中-R表示递归处理目录及其下的内容。5.2chgrp修改文件所属组chgrp用于修改文件或目录的所属组。基本格式chgrp组名 文件名例如chgrpusers/abc/f2这条命令用于将/abc/f2的所属组修改为users。同样递归修改可以使用-Rchgrp-Rusersmydir5.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执行umask即可查看当前的权限掩码。课件还给出了修改方式umask044执行后会把当前 shell 的umask设置为044。这会影响随后由该 shell 中的程序创建文件或目录时所采用的默认权限限制。6.2umask的基本计算思路课件给出的计算关系是实际创建权限 基础权限 ~umask这里的是按位与~表示按位取反。实际计算时需要按照权限位来理解而不是把几个十进制数字直接做普通算术减法。例如在常见的umask 022情况下普通文件的基础权限为666应用掩码后通常得到644。目录的基础权限为777应用掩码后通常得到755。对应关系可以写成普通文件666 → 644 目录 777 → 755需要注意实际创建权限还会受到程序创建文件时指定的模式等因素影响。umask是权限限制机制不是直接给每个文件指定固定权限的命令。6.3 为什么要有umask可以把umask理解为创建文件时的一道默认权限限制。系统不希望每次创建文件都默认开放所有可能的权限因此会通过umask对基础权限模式进行限制。这样新建文件或目录时就可以默认排除某些权限减少不必要的访问。七、目录权限的实际判断把r、w、x放在一起理解回到前面的核心问题为什么目录的权限会影响文件操作假设有这样一个目录/home/shared/其中包含/home/shared/report.txt访问report.txt时系统不仅需要考虑report.txt本身的权限还需要考虑沿途目录是否允许用户搜索和遍历。如果用户没有某一级目录所需的x权限即使知道文件的完整路径也可能无法正常访问该文件。课件对目录权限的总结可以概括为目录没有x权限时用户无法正常进入或遍历目录。目录没有r权限时用户可能无法列出目录中的文件名但如果拥有x权限仍可能在知道具体名称的情况下访问特定条目。目录没有w权限时用户通常不能通过修改该目录项来创建、删除或重命名其中的条目。可以通过下面的流程理解一次访问判断否是否是用户请求访问文件检查路径中的目录权限是否允许搜索和遍历访问失败检查目标文件的访问权限是否满足操作要求访问失败继续执行操作这是一种用于理解基础权限模型的简化流程。Linux 实际访问控制还可能涉及 ACL、进程凭据、特殊权限位、挂载选项等机制。7.1 目录写权限与文件删除再强调一次目录写权限与文件写权限并不相同。假设 Bob 对/home/shared拥有相应的目录写权限和搜索权限但没有report.txt的写权限。在没有其他限制时Bob 仍可能删除这个文件因为删除动作主要改变的是父目录中的目录项。这也是为什么 Linux 需要考虑目录自身的访问权限而不是只检查文件自身的权限位。7.2 粘滞位共享目录中的额外限制课件最后还介绍了粘滞位sticky bit并将其标记为选学内容。例如chmodt /home/设置粘滞位后可以使用ls-ld/home/观察目录权限字符串末尾是否出现t。在典型的共享目录场景中粘滞位可以限制普通用户删除或重命名目录中的其他用户文件。通常能够进行这类操作的包括文件所有者、目录所有者以及具有相应特权的管理员。它解决的是一个典型问题即使一个目录允许多个用户创建和删除文件也不代表每个用户都应该可以随意删除其他用户的文件。粘滞位是在基础目录权限之上增加的一项限制不应将它与普通的rwx权限混为一谈。八、总结理解权限需要建立怎样的知识链Linux 权限不是孤立的几个字母而是一套用于管理访问行为的机制。本篇可以归纳为以下知识链第一使用ls -l观察文件类型、所有者、所属组和基本权限。第二理解u、g、o三类访问者以及r、w、x在普通文件和目录上的不同含义。第三掌握chmod的字符形式与八进制数字形式理解755、644等权限组合的来源。第四区分chmod、chown和chgrp的职责修改权限、修改所有者、修改所属组。第五理解umask如何影响新建文件和目录的默认权限。第六认识目录权限与文件权限之间的关系理解为什么删除文件不等同于修改文件内容并初步了解粘滞位的作用。真正理解这些内容之后遇到权限问题时就不必只靠试命令来解决而是可以从访问者身份、目标对象、权限类别和路径目录等方面逐步分析。这也是学习 Linux 权限最重要的目标不只会修改权限还要能解释系统为什么允许或拒绝一次操作。