Premission
什么是权限
权限应该分为两部分来说:1.事物所具有的属性;2.人所具有的身份
事物属性
若对象是一个碗,它具备可以装东西的属性,但并不具备被吃掉的属性;若对象是一棵树,它具备光合作用的属性、汲取地下水和营养的属性,但它并不具备说话的属性;换言之,Linux 中一切皆文件,文件所具有的三个重要属性分别是:读(read)写(write)执行(execute),他们分别对应三个字母:r w x。
人的身份
若你是一名特警,则在执行公务时可以持枪;如果你是一家公司的员工,则凭借员工卡或人脸可以进出公司。你的身份决定了你能干什么事不能干什么事。人 + 身份 才有了对事物的权限,例如能否进出公司取决于你是否是公司员工这个身份,而与人无关。 在 Linux 中,“人” 分为:root用户 和 普通用户,而他们的身份分别有:拥有者 所属组 其他人,普通用户可以是文件的拥有者,所属组或者是其他人,root 亦然。每个身份对特定文件所具有的权限也是特定的。(root 不受权限约束,故以下权限讲解都未用 root 做对照)
见下图:
绿色方框:代表文件的类型
-:普通文件(文本,可执行程序,库等)
d:目录文件
b:块设备文件(磁盘文件等)
c:字符设备文件(键盘,显示器等)
p:管道文件
......
红色方框:以三个为一组,分别代表拥有者、所属组和其他人的权限。且三个权限的位置是确定的,必须是固定的 r w x。若用 - 表示则说明无此权限。
黄色方框:左边代表拥有者,右边代表所属组。
权限的作用
普通文件
由红色部分可知,现在的用户是 Thepale2022,且 Thepale2022 是文件的拥有者和所属组(这里仅判定为拥有者,详见文章末尾),故具有 r w 权限,没有 x 权限。(绿色部分:具有写权限证明;蓝色部分:具有读权限证明;粉色部分:不具有执行权限证明)
由红色部分可知,现在的用户是 Jones,既不是拥有者也不是所属组,故这也就是为何身份里面只有拥有者和所属组,因为若不在它们之中,则必然是 others(其他人),故具有 r 权限,没有 w x 权限。(绿色部分:具有读权限证明;蓝色部分:不具有写权限证明;粉色部分:不具有执行权限证明)
r:可以读取文件(包括用工具打开文件,指令输出文件内容等)
w:可以修改、创建、删除文件(包括 touch mv rm 等指令)
x:可以执行文件
(关于删除部分涉及到目录权限,故务必先看完再整体分析)
目录文件
此时创建一个目录 dir,且在目录中放入一个普通文件 a.txt
由红色部分知用户为 Thepale2022,对此目录具有 r w x 权限,并分别证明(绿写 蓝读 粉执行)。而进入目录这一操作所涉及到的是执行权限,非读取权限:
这里去除了执行权限,通过绿色部分发现无法正常进入目录,蓝色部分读操作和粉色部分写操作都被拒绝。(虽然蓝色部分仍然读取出了文件内容,可理解为虽不能进去,但不妨碍在窗户边看,但如果查看文件的具体信息是不可能的)故无论是读操作还是写操作,都需要先执行进入目录再操作。
对于此类基本权限已颇为了解,此处对目录特定权限进行深入解析:
目录的权限是所有人可读可写可执行(红色部分),但目录内文件 hello.txt 对于 others 只有读权限(绿色部分),此时切换用户到 Jones,现在其所对应的身份是 others,对文件进行删除,发现删除成功(蓝色部分)。
如果去除了 others 的写权限(红色部分),则无法删除(绿色部分)。故得知:一个文件能否被删除由目录权限决定,与文件自身权限无关。故在讲述文件权限时并未列举删除操作。
粘滞位
如果存在共享文件的需求,则需要共享文件夹,首先需要知道的是,任何用户的家目录权限都是:rwx --- ---,即写在家目录里的文件,别人想访问是不可能的。见下图:(以上所阐述的文件权限和目录权限的举例是因为有 root 权限的辅助得以完成)
故在根目录下建立共享文件夹是一种解决方案,且共享文件夹的拥有者和所属组都是 root(只有 root 可以在根目录下创建文件),所以任何用户相对于共享文件夹而言都是 others,这时如果将 others 的权限设置为 r w x,则任何人都可以对任何人的文件删除和修改等;但如果设置为 r - x,则没有人可以在里面创建文件和共享文件了(除了 root ),如何找到一种方法使得文件可以被任意创建和访问,但只能被文件拥有者删除呢?粘滞位 t 实现这一功能。
红色部分可知,给 others 加上了 t 权限,t 是一种特殊的 x 权限,作为 Thepale2022 无法删除 Jones 的文件,目的达成,即粘滞位的作用(是否可以正常访问和执行由文件权限决定)。
权限的修改
加减修改
首先,一个文件的权限只能由其拥有者更改(root 不受权限约束故 root 可随意更改)。
其中 u 代表 user(拥有者),g 代表 group(所属组),o 代表 others(其他人)。 通过对其加减权限可以实现权限的修改。
乱序、多个权限同时修改也是允许的。
八进制修改
权限三三为一组,且权限只有有无之分,故可用二进制 0/1 表示,则三个二进制位刚好可以等同于一个八进制位,则用三个八进制位可表示所有权限。例如 7 的二进制是 1 1 1,则 7 表示 具有 r w x 权限;2 的二进制是 0 1 0,则 2 表示具有 - w - 权限。
起始权限
可以看到,当默认创建普通文件和目录文件时,其都有它的默认权限。
普通文件对应的是 6 6 4,目录文件对应的是 7 7 5。其实不然,普通文件的起始权限是 6 6 6,目录文件则是 7 7 7。 而这一变换过程涉及到 权限掩码。
通过 umask 指令可以查看权限掩码。
第一位表示特殊权限,暂且不论。后三位表示对应的权限八进制形式,而掩码即表示它所具备的权限应该是所创建的文件所不具备的,这就是 掩 的特性。拆分为二进制,0 0 2 所对应的为 000 000 010,则表示 others 的 w 权限在创建时默认去除,也就是掩盖了这个权限,即出现在 umask 中的权限不会在最终的文件权限中出现。
默认权限 = 起始权限 & (~umask),故可知并不是简单的相减关系。
若更改 umask 为 0001:
可发现文件的默认权限为 6 6 6,目录的默认权限为 7 7 6,故不是简单的相减关系。
证明文件默认权限:
0 0 1 -> 000 000 001
~(000 000 001) -> 111 111 110
(110 110 110) & (111 111 110) == (110 110 110) == 6 6 6
其他问题
权限判断顺序
Thepale2022 同时是拥有者和所属组,但当拥有者没有写权限,所属组有写权限时,Thepale2022 并不能进行写入。因为身份的判定是如下逻辑:
if(Is_own(Thepale2022)) //先判断是不是拥有者
{
return own; //如果是直接返回拥有者身份
}
else if(Is_group(Thepale2022)) //再判断是不是所属组
{
return group; //如果是则返回所属组身份
}
else
{
return others; //否则返回其他人身份
}
故 Thepale2022 被认定为拥有者,拥有者不具有 w 权限,尽管所属组具有,但 Thepale2022 此时为拥有者,不具有所属组的权限。