【Linux系统】—— 权限的概念
- 1 权限
- 1.1 什么是权限
- 1.2 为什么要有权限
- 1.3 理解权限
- 2 文件的权限
- 2.1 文件角色
- 2.2 文件权限
- 2.3 修改文件权限
- 2.3.1 修改目标属性
- 2.3.1.1 字符修改法
- 2.3.1.2 8进制修改法
- 2.3.2 修改角色
- 3 文件权限补充知识点
- 3.1 只能修改自己的文件权限
- 3.2 没有权限
- 3.3 确定权限位规则
- 3.4 root 用户的权限
- 3.5 如何理解可执行
- 4 目录的权限
- 4.1 rwx 分别对目录代表什么
- 4.2 理解 Linux 多用户之间的隔离
- 4.3 缺省权限
- 5 粘滞位
- 5.1 现象引出
- 5.2 删除文件所需权限
- 5.3 多用户如何进行文件级别协作
- 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 目录中
控制变量法,我们挨个来试一下
- 只开读权限
与读权限没关系
- 只开写权限
与写权限没有关系
- 只开执行权限
成功了
所以进入一个目录需要执行权限!
既然进入目录需要执行权限,那读权限和写权限对于目录来讲意味着什么呢?
没有读权限,我们无法查看目录中的文件内容,即「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 的学习路上一起进步!