Linux-Premission

142 阅读8分钟

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 此时为拥有者,不具有所属组的权限。