【Linux系统】—— 权限的概念

【Linux系统】------ 权限的概念

  • [1 权限](#1 权限)
    • [1.1 什么是权限](#1.1 什么是权限)
    • [1.2 为什么要有权限](#1.2 为什么要有权限)
    • [1.3 理解权限](#1.3 理解权限)
  • [2 文件的权限](#2 文件的权限)
    • [2.1 文件角色](#2.1 文件角色)
    • [2.2 文件权限](#2.2 文件权限)
    • [2.3 修改文件权限](#2.3 修改文件权限)
      • [2.3.1 修改目标属性](#2.3.1 修改目标属性)
        • [2.3.1.1 字符修改法](#2.3.1.1 字符修改法)
        • [2.3.1.2 8进制修改法](#2.3.1.2 8进制修改法)
      • [2.3.2 修改角色](#2.3.2 修改角色)
  • [3 文件权限补充知识点](#3 文件权限补充知识点)
    • [3.1 只能修改自己的文件权限](#3.1 只能修改自己的文件权限)
    • [3.2 没有权限](#3.2 没有权限)
    • [3.3 确定权限位规则](#3.3 确定权限位规则)
    • [3.4 root 用户的权限](#3.4 root 用户的权限)
    • [3.5 如何理解可执行](#3.5 如何理解可执行)
  • [4 目录的权限](#4 目录的权限)
    • [4.1 rwx 分别对目录代表什么](#4.1 rwx 分别对目录代表什么)
    • [4.2 理解 Linux 多用户之间的隔离](#4.2 理解 Linux 多用户之间的隔离)
    • [4.3 缺省权限](#4.3 缺省权限)
  • [5 粘滞位](#5 粘滞位)
    • [5.1 现象引出](#5.1 现象引出)
    • [5.2 删除文件所需权限](#5.2 删除文件所需权限)
    • [5.3 多用户如何进行文件级别协作](#5.3 多用户如何进行文件级别协作)
    • [5.4 粘滞位](#5.4 粘滞位)

1 权限

1.1 什么是权限

权限的本质:能或不能做某些事情

权限决定的是能还是不能的问题。比如校长能进他的办公室,你就不能进校长办公室;某些电影电视剧只有 VIP 能看,而你不是 VIP 就不能看。

1.2 为什么要有权限

为什么要有权限呢?本质上还是为了控制用户的行为,防止错误的发生。

如果没有权限:一个关键的文件,本来只有管理员才能卸载的,没有权限随便一个普通人就能卸载,那可能导致整个系统的崩溃。我新写的文件,随便被某个人复制过去,我做任何事情都没有任何东西保护......如果没有权限,可能会导致各种各样的错误发生。

权限规则的设定,永远是最顶级的上层的人设计,比如写 Linux 的程序员,以限制普通用户的行为,防止混乱和错误的发生

1.3 理解权限

现在我们对权限的概念还很模糊,我们通过两个例子来了解权限。

例一:

为什么校长能进校长办公室,而你不能进校长办公室?这说明权限首先限制的是"人"

我们再想一想:假如校长叫老王,它能进校长办公室是因为它叫老王还是因为它是校长呢?

我们发现在这个世界上你是谁一点都不重要,你扮演什么角色才是最重要的

一个公司的大老板,事业辉煌时人前人后;日落西山,没人理他。人还是那个人,之所以这样是以为他的角色变了

权限首先限制的是角色

例二:

我是无法再VS上看电影的,我也无法再爱奇艺上写代码。

这说明什么呢?

这说明如果要访问的目标对象天然没有目标属性,那么他也绝对不会具备对应的权限

即便我是爱奇艺的顶级会员,我也没有在其上面写代码的能力,因为爱奇艺压根没有写代码的功能

所以 权限要求对应的目标必须具备对应的属性

结论:

权限 = 角色 + 目标权限属性

2 文件的权限

2.1 文件角色

通过前面的学习,我们知道 Linux中一切皆文件,因此未来我们操作 Linux 系统都是面对的对象都是文件。

权限 = 角色 + 目标权限属性

对一个文件来说它的文件属性无非就三个:读权限写权限执行权限

而文件的角色又有谁呢?也分三种:拥有者所属组other

我们在系统目录下查看到的文件信息基本都如下图所示:

黄框那一列表示文件的拥有者,蓝框那一列表示文件的所属组。那怎么不见 o t h e r other other 呢? o t h e r other other 不用单独记录,只要不是拥有者和所属组,就是other。拥有者和所属组一定是具体的某个人,而 o t h e r other other 非常多,不必记录,也不可能完全记录

这里问大家一个问题:root、gy、user1、user2等用户与拥有者、所属组、other他们是什么关系呢?

拥有者、所属组、other 是一种角色 ,像前面的校长角色;而 root、gy、user1、user2 是具体的人 ,像前面的老王。

一个文件通常有拥有者等角色,而每个角色是由对应的"人"来扮演的。比如 gy 用户,它可以是一个文件的拥有者,也可以是一个文件的 other。他们间并不冲突,反而还互相补充。


什么是所属组呢?

首先所属组可以是很多人构成一组,也可以是一个用户自成一组。现在使用 Linux 很多时候都不用考虑所属组的问题,因为大部分时候都是自成一组

那为什么要设计界出所属组呢?

举个栗子:

背景如下:现在公司让小明所在的 A组 与 B组 共同研发一个功能,看谁研发出来的更好就用谁的。

小明吭哧吭哧敲了几天代码,一天组长要看小明的代码写的怎么样了。组长要看到小明写的代码,小明就要开放相关文件的权限,如果文件的角色只有 拥有者 和 other ,那么拥有者无疑是小明,组长是other身份,所以组长要看代码小明只能开放 other 角色的权限,那 B组 的成员也是 other 角色,这样不就也可以看到了小明的文件内容了吗。所以 Linux 设计出了所属组的角色,这样小明只需要将组长拉进所属组的角色,开放所属组的权限,这样组织就能看到,而 B组 成员还是 other 角色,就看不到小明的代码了。

2.2 文件权限

对于一个文件来讲,它所具备的属性无非就三种:读属性、写属性、执行属性

在 Linux 中:读用 r 表示;写用 w 表示;执行用 x 表示

未来我们表述文件的权限时,要把文件的角色和目标属性结合起来进行表述

如:某某文件的拥有者具备读写属性、所属组具备读写属性、other 具备读属性

对于任意文件来讲,它有三种角色,每种角色对应三种属性

在前面 「ll」 命令所显示的众多文件属性中,第一大列所显示的属性就代表着文件的权限

它的第一大列的第一列即第一个字符表示 文件类型;第一大列除去第一个字符还剩下 9 个字符,这 9 个字符又每三个字符分为一组,每组分别代表着三种角色所拥有的权限,按顺序分别代表着拥有者、所属组、other

每一组分别有三个字符:第一个字符表示该角色是否允许读(r/-)、第二个字符表示该角色是否允许写(w/-)、第三个字符表示该角色是否允许执行(x/-)

每组的的三个字符代表的属性一定是按顺序:读(r/-)、写(w/-)、执行(x/-),该位置上只能有对应字母和 "-"两种字符

例如描述 root.txt 文件的权限:该文件的拥有者是 root,拥有者能够读、写文件但不能执行;所属组是 root。所属组对该文件只有读权限不能写和执行;other 对该文件只有读权限不能写和执行

Linux表示 说明 Linux表示 说明
r-- 只读 -w- 仅可写
--x 仅可执行 rw- 可读可写
-wx 可写和可执行 r-w 可读可执行
rwx 可读可写可执行 --- 无权限

2.3 修改文件权限

2.3.1 修改目标属性

2.3.1.1 字符修改法
  • 语法:「chmod」 [选项] 权限 文件名
  • 功能:改变文件或目录的访问权限,用它控制文件或目录的访问权限。

+ - = 权限字符

    • : 向权限范围增加权限代号所表示的权限
    • : 向权限范围取消权限代号所表示的权限
  • = : 向权限范围赋予权限代号所表示的权限
    用户符号:

  • u:拥有者

  • g:拥有者同组

  • o:其它用户

  • a:所有用户

我们以 t e s t . t x t test.txt test.txt 文件为例:

给拥有者减去r权限

给所属组加上x权限

给 other 加上 wx 权限

给所有人减去 w 权限

给拥有者和所属组加上 w 权限

2.3.1.2 8进制修改法

除了上面的修改方法,修改文件属性还能利用8进制进行修改

前面曾经说过,每一组都有三个字符,每一位由:r/-、w/-、x/- 二选一,你会发现三个位置上的状态都是两态的,可以认为是:是和否。

既然是两态的,我们为什么不能把他 看做是1/0 呢?如:r- - 看成 100;-w- 看成 010;rw- 看成 110。反正每个位上表示的属性是确定的,1代表该位置有效、0代表代位置无效

同时因为2进制对我们用户不友好,我们转换为 8进制(3个 bit 位)。110 = 6 = rw-、100 = 4 = r--

我们可以利用这点来修改文件属性

2.3.2 修改角色

  • 语法1:「chown」 [选项] 用户名 文件名
  • 功能:更改文件或目录的拥有者。

我们以 test.txt 文件为例。此时 test.txt 文件的拥有者和所属组都是 gy 用户

将拥有者改为 root

我们发现不能改

是不是不能给 root 呢?那我把文件给普通用户

还是不行。

为什么呢?

你想把你的文件给别人,你凭什么给被人呢?将文件的属性修改,是因为这个文件是你的你可以去修改,影响上只能影响你自己。但你把文件给别人,影响的就不仅仅是你自己,要是你给我一个全是 bug 的文件,甩锅给我,那我怎么办。

所以系统默认不允许把文件给别人,想给别人必须高权限!

所以想将文件给别人要切换 root 用户或者指令的短暂提权(你要不要?不要我揍你),这里我们直接切换 root 用户

「chown」还能同时修改拥有者和所属组

  • 语法:「chown」 [选项] 拥有者:所属组 文件名
  • 功能:更改文件或目录的拥有者和所属组。

先将 test.txt 文件的拥有者改回来

同时修改拥有者和所属组

如果只想改文件的所属组,可以用「chgrp」

  • 语法:「chgrp」 [选项] 用户组名 文件名
  • 功能:修改文件或目录的所属组

3 文件权限补充知识点

3.1 只能修改自己的文件权限

任何人都能修改文件权限吗?

不是的,用户只能修改自己的文件权限

上面我们能改 test.txt 的文件权限,那是因为改文件拥有者是 gy 的,而我们是以 gy 用户的身份去改的

如果文件拥有者是 root/user1/user2 等,gy 用户是不能修改的

3.2 没有权限

如果我们本身不具备某种权限,那么系统会拒绝我们的访问

我现在是 test.txt 文件的拥有者,我可以对文件进行操作


我们将拥有者的 r 权限关闭,无法读只能写

再把拥有者的 w 权限关闭,写也不能写了

可见如果我们本身不具备某种权限,那么系统会拒绝我们的访问。

3.3 确定权限位规则

可是有细心的小伙伴可能发现:gy 用户确实是 test.txt 文件的拥有者,该文件的拥有者权限也确实全关闭了,可 gy 用户还是 test.txt 文件的所属组啊,所属组的读和写权限还在呢?为什么我不能以所属组的身份去访问呢?系统依然不允许我们去读和去写

实际上,在确定权限信息时,系统会先确定用户是谁?是拥有者、所属组还是 other。在 ubunto 和 centos 下用户角色的确定,只确定一次,顺序依次是拥有者、所属组、other。即一旦确定用户是拥有者,只看拥有者对应的权限,即使拥有者没有任何权限也不再二次确认用户是否是所属组

有小伙伴可能会问:关所属组和 other 的权限我能理解,为什么要拥有者的权限呢?闲的没事干吗

有时候我们是需要将拥有者的权限关闭的。有些文件比较重要,这时为了防止自己误操作 ,就可以将自己的权限关闭。而且自己的权限随时能打开,毕竟文件是自己的,文件权限随时能修改

3.4 root 用户的权限

我们关闭 test.txt 文件 other 的所有权限

现在,我们用 root身份 去读和写 test.txt 文件

理论上来说,root 不是拥有者也不是所属组,理应是不能读和写的,但事实真是这样吗?

事实是 r o o t root root 即能读也能写。

r o o t root root 还能把整个文件的权限关了,自己依然能访问

听说拥有者能把权限改回来?那我把拥有者改为我自己,这文件你也不要要了

所以: r o o t root root 的权限不受任何权限约束。

所有的规则权限都是用来限制普通人的,总要有一个超用户权限来进行一些错误的修正

这也说明了为什么普通用户不能把文件给别人,而 root 可以强制将文件给别人

3.5 如何理解可执行

在前面我们谈论文件的权利时,主要谈论的是读和写,但别忘了文件还有一个属性是可执行

如果我给角色可执行的权利,那这个文件就可以被执行了吗?

答案是否定 的。

可执行权限 != 文件可执行

怎么理解呢?

有一句话叫:给你机会你不中用啊

这句话说明什么呢?什么你想办成一件事,首先要给你机会,其次你要有能力 。机会和能力缺一不可。

给你机会你不中用意思是给了你就会但你没这个能力,所以这事你也做不成。

给文件加了可执行权限只是允许这个程序将来可以被执行,但不代表这个程序本身就可以执行。只有你具有可执行权限,在加上你本身就可以执行,两者结合你才能真正的才能执行

4 目录的权限

4.1 rwx 分别对目录代表什么

现在我问大家一个问题:如果我想进入一个目录,需要什么权限呢?会是读权限吗

现在我们想进入 code 目录中


控制变量法 ,我们挨个来试一下

  1. 只开读权限

    与读权限没关系
  2. 只开写权限

    与写权限没有关系
  3. 只开执行权限

    成功了

所以进入一个目录需要执行权限!

既然进入目录需要执行权限,那读权限和写权限对于目录来讲意味着什么呢?

没有读权限 ,我们无法查看目录中的文件内容,即「ls」指令无效

没有写权限 ,我们无法在目录中新建文件或者删除文件

总结:

  • 可执行权限:如果目录没有可执行权限,则无法进入目录中
  • 可读权限:如果目录没有可读权限,则无法通过「ls」等指令看到目录中的文件内容
  • 可写权限:如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件

那如果我是超级用户呢?

超级用户不受权限约束,即使目录没有任何权限,超级用户依然可以为所欲为

默认情况下,新建一个目录,rwx 权限都要有,因为少一个权限它的操作就不完整

4.2 理解 Linux 多用户之间的隔离

在 Linux 下,可以创建多个用户,用户之间彼此是互相不影响的。 Linux 是怎么做到的呢?

在我们的 Linux 系统中,我们每新建一个普通账号,这个普通账号都会在 home 目录下新建一个以该用户名命名的目录。当以某一用户登录时,默认所处家目录就是:/home/用户名

仔细观察一下 gy 目录,发现它拥有者权限是全部开启,但是 所属组 和 other 关闭了写的权限 。这意味着任何其他用户都不能对其他用户的家目录进行修改

这样就能实现多用户之间的隔离

4.3 缺省权限

我们新建一个文件,默认权限是这样的

新建一个目录,默认权限是这样的

为什么默认权限会是这样子的?

  • 对于普通文件:起始权限从 666 开始,即普通文件默认不带可执行。
  • 对于目录文件:起始权限从 777 开始。

可是这好像也不对,新建出的普通文件是 664,而目录是 775。甚至各位小伙伴可以自己新建一个普通文件和目录,发现其权限与我当前都不一样。

也就是说最终的权限并不等同于起始权限 。系统中有一个概念叫权限掩码,最终的权限还受权限掩码的影响

权限掩码可通过 umsk 去查看

我当前系统的权限掩码是 0002

权限掩码是在系统默认是设置好的 ,它是一个8进制的数字

第一个 0 我们不用考虑,它是与用户相关的,我们只需要考虑后面的数字

这里的 002 换成二进制 000 000 010

文件最终权限 == 起始权限 &( ~umask )

我们以普通文件777为例

777 换成二进制为 111 111 111

000 000 010 按位取反为 111 111 101

按位与得 111 111 101

因此普通文件最终权限为775

那 u n a s k unask unask 的目的是什么?

u m a s k umask umask 最终的目的是:凡是在 u m a s k umask umask 总出现的权限,都不应该在最终权限中出现

为什么要有 u m a s k umask umask 呢?

如果没有 u m a s k umask umask,一个文件创建时默认的权限,由 OS 自主决定,无法在创建前进行修改。由 u m s k umsk umsk,则系统可以灵活满足不同的需要。

在有些特殊情况下,我们可以通过配置 u m a k umak umak 控制文件的默认权限,让我们的代码都是可控的

u m a s k umask umask 是可以修改的

这时我们再新建普通文件和目录就没有任何权限啦

u m a k umak umak 是内存级的,也就是说你修改了 u m a s k umask umask ,下次登录时 u m a k umak umak 还是系统的默认值。

5 粘滞位

5.1 现象引出

下面,我以 root 用户在普通用户 gy 的目录下创建一个 root.txt 文件

此时文件的拥有者与所属组都是 root,我们再将文件的 other 权限全部关闭

我们再切换回普通用户 gy,通过前面的学习我们知道,此时 gy 用户是无法进行读写的

但是我们吃惊的发现,gy 用户居然可以删除 root.txt 文件

为什么呢?我不是文件的拥有者,而且对该文件没有任何的权限,但我却可以删它!

5.2 删除文件所需权限

我不能读不能写你的文件,但我可以把你的文件删了?这正常吗?

在 Linux 中这是正常的,为什么这么说呢?

当前我们是在 lesson5 的目录下

lesson5 用户的拥有者与所属组都是 gy 用户

gy用户对该目录有写权限,前面我们说过:对一个目录有写权限,就可以修改该目录。 创建新文件算是修改目录的内容,那么删除文件是不是修改目录的内容呢?很明显也算。

所以对于目录来讲,你有 w 权限,不仅能创建新文件 ,删除也算修改,同样可以删除文件

所以为什么 gy 用户能删除 root 用户的文件呢?

答案很简单,因为一个文件能否删除和文件本身无关,只与文件所在目录的 w 权限有关

大家想一想:你先别问我为什么能删root的文件,你先回答我你为什么要在我的目录新建文件,还这么猖狂不给我开权限

一个文件能读能写能执行,是由文件自身决定的,但文件能不能"或"并不由它自己决定,而由它所在的目录决定的

毁灭你,与你何干

事实上,上述情况是很少发生的,因为普通用户是无法进入另一个用户的工作目录下的

我进都进不去,还怎么在里面搞事情呢?

一般能在别人工作目录下新建文件的只有 root;如果是普通用户,那它一定是先变成 root 再进去新建的

5.3 多用户如何进行文件级别协作

现在有一个问题:多用户之间如何进行文件级别的协作呢?

什么意思呢?

举个例子:小明的任务是往文件中写入数据,而小帅的任务是对小明写入的数据进行分析

通过前面的学习,我们意识到这个文件一定不能放在一个私人的账号里,不然另一个人如何进去都是一个问题。

要知道,在 Linux 系统中不仅仅只有 /home 路径,在根目录/下,还有许多与 /home 路径平级的路径,他们不属于任一用户,只属于 root

比如:/tmp

tmp 目录通常放的是临时的数据

我们可以直接将文件放在 tmp 下,该目录给所有人都开放权限,这样大家都能进入该目录访问里面的文件,就能进行多用户之间的协作了。

这里我们为了演示,我们用 root 用户创建一个 temp-backup 文件(在根目录创建文件只能用 root 账号创建),并开放所有权限

比如,现在我用 gy 用户在 temp-backup 目录下创建新文件 gy.txt,gy 用户可以对它进行读写

此时,cwq 用户也可以进入到 temp-backup 目录中,对该文件进行读

当然,如果gy用户如果开放写权限,cwq用户还能对该文件进行写

这样,gy 用户和 cwq 用户之间就能进行文件协作了。

5.4 粘滞位

可是上述有这样一个隐患:如果有人误操作或者故意将 gy.txt 文件删掉怎么办?又或者 cwq 和 gy 闹掰了,cwq 一气之下把 gy.txt 文件删除了怎么办

因为文件的创建与删除至于当前所在目录的 w 权限有关,现在 temp-backup 目录对 other 都开放了 w 权限,也就是说所有人都可以在里面创建文件,也可以删除文件!

能不能通过关闭 w 解决呢?

不行,因为关闭 w,虽然所有人都不能删除了,但是所有人也都不能创建了,也就失去了共享目录的意义

也就是说现在我们有一个需求:对于共享目录,任何人都能创建新文件,但是我们不想让该文件的非拥有者删除文件。

为此,Linux 引入了一个新的权限标志位:t

我们将 t 称为粘滞位

我们先进行实验

首先我们用 root 用户来将 temp-backup 目录加上粘滞位

加上粘滞位后,我们发现目录权限中 other 权限位中的 x 变成 t

此时 cwq 用户依然可以读 gy.txt 文件

但是无法再删除文件了

为什么呢?因为现在有了对应的权限位约束

粘滞位 t 可以让我们在共享目录下,不会让一个非文件拥有者删除文件,即使它有该目录的 w 权限

那 root 可以删除吗?root 是可以的。前面我们说过:root 跳出所有规则的约束,而且 root 是该目录的拥有者

注:粘滞位 t 只能给需要共享的目录添加粘滞位,加粘滞位不是在自己的家目录中加,这样没有任何意义

我们平时是不用让 root 新建一个 temp-backup 来进行文件共享的,根目录下本来就有个 tmp 目录,就是用来进行多用户减的文件协作的

而且我们注意到 tmp目录默认也是加了粘滞位 t 的


好啦,本期关于权限的知识就介绍到这里啦,希望本期博客能对你有所帮助。同时,如果有错误的地方请多多指正,让我们在 L i n u x Linux Linux 的学习路上一起进步!

相关推荐
小技与小术1 分钟前
firewalld详解
linux·运维·网络
tjjingpan6 分钟前
HCIA-Access V2.5_2_2网络通信基础_TCP/IP协议栈报文封装
服务器·网络·tcp/ip
安年CJ8 分钟前
计算机操作系统虚拟化与云计算教学指南
linux·运维·服务器·数据结构·数据库·云计算
Evaporator Core16 分钟前
Apache HTTP 服务器高级性能优化
服务器·http·apache
Evaporator Core18 分钟前
Apache HTTP 服务器的安全配置指南
服务器·http·apache
错误:40419 分钟前
建立基于TCP的客户端和服务端
服务器·网络协议·tcp/ip
A-刘晨阳27 分钟前
【Linux】Nginx一个域名https&一个地址配置多个项目【项目实战】
linux·运维·nginx·http·https
没书读了42 分钟前
ssm-springmvc-学习笔记
笔记·学习
Annaka9181 小时前
蓮说Java | Java中的“.”操作符与“->”操作符在使用上与C语言中的有何区别?
java·c语言·python
小A1591 小时前
STM32完全学习——STemWin的移植小插曲
学习