Linux 权限理解及其概念
文章目录
再次理解Linux的版本
广义上:Linux发行版
=Linux内核
+外壳程序
狭义上:Linux=Linux内核
进程
什么是进程:
对于进程,我们先有个基础的认识就可以了,进程就是一个个运行的程序。
任务管理器上这些运行的程序都是一个个进程。
命令解释器
大家在运行Linux
指令的时候有没有想过,我们敲下的这些指令,究竟是谁在替我们执行呢?
在Linux
中所有指令最终的运行都是通过操作系统
执行的。
但是普通用户在发出指令的时候并不是与操作系统
进行直接交互的,有以下几个原因:
1.操作成本高,普通人想要直接使用操作系统,还需要花费大量的时间去学习。
2.安全性低,一些错误的操作可能会对操作系统造成损害。
因此需要一个媒介帮助用户与操作系统进行间接的沟通。
在Linux
中这个程序就是外壳程序shell
(命令解释器)。
关于三者的关系如图所示:
shell
称作命令解释器的一个原因也是如此,进行指令的交互与翻译。
为了更好的理解,我们通过一个故事来讲述三者的关系:
背景:年轻人阿春回到了村庄,他的父亲是当地的村长。阿春到了谈婚论嫁的年纪了,父亲想为阿春找一个女朋友,于是父亲找到了当地的媒婆。
ps::故事线就是根据图中的1,2,3,4
进行发展的。
(1)阿春告诉媒婆他看上了如花。
(2)媒婆将这个消息传递给如花。
(3)如花得到消息以后告诉媒婆她并不喜欢阿春。
(4)媒婆将如花拒绝阿春的消息告诉阿春,并让阿春放弃。
可是阿春非常喜欢如花,所以他又去找了媒婆,于是:
(1)阿春让媒婆再去找如花。
(2)媒婆又去找了如花。
(3)如花说她已经结婚了,不可能会和阿春在一起的。
(4)媒婆告诉阿春说,他和如花不可能的,让他换个人。
谁知道阿春这小子,就一心要找如花。于是他又去找了媒婆:
(1)阿春让媒婆再去找如花
(2)这时媒婆因为知道如花不可能答应阿春这个结果了,所以他没有将阿春的需求告如花,而是直接将如花拒绝他的结果告诉啊春。
媒婆的这种行为其实也是对如花的一种保护。我们将阿春看作普通用户
,媒婆看作是外壳程序
,如花看作是内核os
。这时媒婆绕过如花直接将结果告诉阿春的行为也就是外壳程序
对内核os
的一种保护。
这种行为类似在xhell
上执行错误命令:
shell外壳
提前就知道了这是一个错误指令,因此就不会将这个指令传递给内核os
,而是直接将结果告诉用户。
阿春这小子真的有毒,又叫媒婆去找如花。媒婆这时候想:这小子也是有问题,但是阿春父亲又是当地的村长,媒婆没法拒绝。媒婆作为村庄有名的媒婆,她心想,她这样每次去找如花,肯定会砸了自己的牌匾的。因此
媒婆想出了一个做法:
(1)阿春再次找媒婆
(2)媒婆想出的方法就是让底下的员工去找如花,这样既不会砸了她作为当地有名媒婆的牌匾,又不会让村长没了面子。
(3)员工找到了如花,告诉了如花阿春的要求
(4)如花也是很烦,依旧还是拒绝了阿春。
(5)员工将如花的结果告诉媒婆
(6)媒婆将结果告诉阿春
媒婆的这种行为既保护了自己的牌匾,又不会让村长没了面子,事情一直在办,虽然没有结果,但是就是一直在运行着。
故事就结束了:我们依旧将阿春,媒婆,如花三者对应用户
,外壳程序
,内核os
。将媒婆的员工看作是外壳程序创建的子进程。
对应Linux中就是外壳程序创建子进程,为其进行命令解释的工具。
创建子进程有一个好处:即使该子进程因为遇到有风险的事情挂掉了,其也不会影响到外壳程序,也就是对应媒婆的牌匾不会受到影响。
总结:外壳程序的作用:
1.保护内核安全。
2.拒绝非法访问。
3.处理请求指令,外壳程序直接与内核进行指令交互或者创建子进程帮助他和内核进行交互。
但是问题又来了,我们前面都在讲shell
外壳程序的作用,那么这个bash
又是个啥玩意?
可以这里理解:shell
是所有外壳程序
的统称,而bash
是Linux
下具体使用的一种类型的外壳程序。
举例说明:shell
是手机的品牌,bash
就是其中的一个品牌,如小米。
再次理解进程
前面我们说外壳程序会创建子进程为他执行命令解释工作,那么外壳程序本身是否又是一个程序?或者说是一个进程呢?
答案是的:外壳程序本身也是一个进程,用户每次登录Linux
就会为其创建一个bash
。
对此我们进行验证:
当登录一个用户时:
Linux
为我们创建了一个bash
。
当登录第二个用户时:
我们发现多了一个PID
为221310
的bash
,这也验证了结论:每次登录Linux
都会为用户创建一个bash
。
ps::
ps axj :查看当前运行的所有进程。
如果我们将这个进程杀掉会怎么样呢?
将编号为221310
的bash
干掉以后,用户直接退出登录了,没有bash
,就没人能够进行命令解释的工作了。
权限
什么是权限?
百度百科是这样定义的:“权限是指为了保证职责的有效履行,任职者必须具备的,对某事项进行决策的范围和程度。”
这种官方的定义对于我来说自然是不能理解了:我是这样理解权限的,我平常有使用酷狗音乐听周杰伦的歌曲,但是周董的歌都需要vip
,所以如果我没有充值,我就听不了这个歌曲,这也就是我没有这个权限。一旦我充值了会员,我就会获得听会员歌曲的权限。
总的来说:
1.权限是对人,也就是对用户的一种约束。
2.权限=人+属性
3.文件都带有三种权限:1.读权限
,2.写权限
,3.执行权限
。
这个概念我们会慢慢在后面进行渗入。
关于权限:大家有一个大致的概念就好了,在后面的学习中会逐渐加深Linux
中权限的认识。
Linux中的两种用户
在基础指令部分我们就有提到Linux
中的两种用户:
(1)普通用户:具有一般的权限,需要受到权限的约束。
(2)root
用户:Linux
中的超级管理员,具有很高的权限 。
普通用户和root用户如何转换
在使用普通用户的时候,因为权限
( 1 ) (1) (1)普通用户切换root
用户
格式:su -
格式:su
功能:从普通用户转换为root用户
ps::在输入指令以后需要输入root
用户的密码,上面的两种格式都可以切换成root
用户,第一种格式切换到root
以后会跳转到root
的工作路径,而第二种格式会保持当前路径。
( 1 ) (1) (1)普通用户切换成另一个普通用户
格式:su - 切换的用户名
功能:切换成其他的普通用户。
ps::输入的是所切换用户的密码。
关于su
命令还需要注意的是:在当前用户的基础上切换用户的时候,上一个用户不会被关闭,其仍然在运行,所以如果我们想要退回上一个用户:
输入exit
或者ctrl+d
进行回退(回退以后当前用户就会被关闭)就行了。
如下图所示:
当前用户为tailin
切换root
用户
使用exit
命令回到最初的用户tailin
ps::如果切换了很多次,那么就可以多次回退到。
注意::使用su
命令切换的时候,不能一直进行切换:
因为我们说了每次切换都会创建一个新的用户,并且之前的用户不会被关闭。每次创建一个用户Linux
都会创建一个bash
,频繁的切换并且不回退就会导致系统中创建了很多个bash
,就会导致需要占用很大的运行空间,致使系统运行变慢。
对此进行验证:
每次使用su
命令切换成普通用户和root
用户,bash
的个数是不断增长的。
( 2 ) (2) (2)临时切换成root用户执行当前命令
sudo + 要执行的命令
这样这条命令就是以root
的身份执行
关于sudo
的信任配置涉及到vim
的知识,在下一篇博客vim
中,我们会具体讲到如何添加信任关系,大家可以暂时先使用su
一段时间。
linux中的用户类别
Linux
中有三种用户类别:
(1)拥有者 owner
(2)所属组gruop
(3)其他 other
对于三个用户类别具体是什么意思我们在后面会说明,接下来我们先进行学习文件的详细属性信息:
(1)Linux中的文件类型:
Linux
中的文件不以后缀进行区分。
在Linux
下,一切皆文件,这个概念很重要。
(2)用户类别权限
红黄绿分别对应不同类别对于该文件所具有的权限。
r
:读权限
w
:写权限
x
:执行权限
-
:不具有对应的权限
如myfile
文件:
拥有者:rw-
,拥有者对于该文件能够读,能够写,不能执行。
所属组:rw-
,所属组对于该文件能够读,能够写,不能执行。
其他:r--
,其他对于该文件只能读。
(3)拥有者和所属组
在Linux
中,第一个名字代表拥有者,第二个名字代表所属组。
如file.txt
的拥有者为Fengli
,所属组为Fengli
。
拥有者:拥有者就是文件的拥有者。
对于拥有者,想问大家一个问题,文件的拥有者是否就是文件的创建者
这个问题一开始我也没想清楚,但是我们类比生活就很简单了,我们花钱买东西,但是那个东西不是我们创造的,但是我们花钱以后他就属于我们了。
所以说文件的创造者不一定就是文件的拥有者!!!
其他:不是文件拥有者就都属于其他
这两个类别都很好理解,但是所属组又是个什么东西:
我们举例说明:
在一家公司内部,有两个小组A
组和B
组,公司最近要出一款游戏,两个小组分别要给出游戏的设计方案,哪个小组的方案好就可以参与游戏的制作,相反另一个小组就需要解散重组。两个小组的关系就属于内部竞争。
并且因为资金不够,两个小组共用的一台服务器。
某一天李四
写了一个文件代码,想要给组长
看一下代码怎么样,但是组长
的用户类别为other
,他不具有查看文件的权限。如果将文件的权限赋予给other
,就会导致竞争对手也能看到自己的代码,这肯定是不行的。
因此所属组对应出现:
可以为属于同一组的组员赋予权限,只有当前组的成员才具有这种权限。
这时组长
和李四
属于同一个组,组长
就具有权限查看李四
的文件。
前面我们说到了root
用户和普通用户,既然有了这两种用户,为什么Linux
中还设置了三种用户类别?
用户类别只是该类别对于文件/目录所具有的权限,最终用户类别还需要具体化映射到一个人身上。说白了other
可能是普通用户,也可能是root
用户。
修改文件对应用户类别的权限
注意::只有文件拥有者
和root
具有修改文件对应类别的权限
( 1 ) (1) (1)增加对应类别的权限
格式:chmod u/g/o+增加的权限 对应的文件名
u:拥有者
g:所属组
o:other
( 2 ) (2) (2)删除对应类别的权限
格式 chmod u/g/o-删除的权限 对应的文件名
( 3 ) (3) (3)支持同时修改多个类别的权限
格式:chmod u+/- 修改的权限 o+/- 修改的权限 文件名
( 4 ) (4) (4)同时修改三个类别的权限
chmod a -/+修改的权限 文件名
作为文件的拥有者:如果没有文件对应的类别权限,还能正常的读写文件吗?
答案是:依旧可以,因为其是文件的拥有者
但是如果没有文件的x
权限,也无法执行文件,因为执行权限受到了强约束。
我们还需要知道一个概念:具有x
权限,就能运行这个文件吗?
能运行这个文件的前提是这个文件必须是一个可执行文件。
举例说明:我们在windows
下创建.txt
结尾的文件,我们具有执行该文件的权限,但是由于文件本身的类别约束,所以其无法运行,在Linux
下也是同理。
证明:给test.c
文件加上x
权限。
root权限
root
是Linux
中的超级管理员,如果使用普通用户创建了一个文件,剥夺other
的所有权限,切换到root
时,权限是否能约束到root
?
test.c
文件中,root
作为other
不具有对该文件的任何权限。
但是经过操作可以看出:
root
可以读取该文件的内容并且还可以修改文件的内容。
但是虽然root
很强大,依旧也会受到一些约束。在Linux
中,可执行文件具有强约束
,如果root
没有x
权限,其也不能运行该文件。(虽然说root
可以修改任意一个文件的权限,但是这也是一种提醒,该文件运行起来可能有风险,作为root
如果你提升了该文件的权限,那么你就得自己承担可能的后果)。
后面对于权限的讨论基本都是基于普通用户的,权限约束的是普通用户,对于root
,权限基本做不到约束。
修改文件的所属组和拥有者
( 1 ) (1) (1)修改拥有者
ps::将一个文件的拥有者修改成其他用户的,对应的也需要这个用户的允许,不能直接就将文件仍给这个用户。因此只有root
对应具有这个权限。
所以在修改文件的拥有者的时候需要通过su
转换成root
进行修改。
格式:chown 修改以后文件的拥有者 文件名
( 2 ) (2) (2)修改所属组
在修改所属组的时候需要对应两种不同的情况,我们进行分类讨论:
一.将文件的所属组转让给其他用户
将所属组转让给其他用户也需要得到那个用户的同意,因此还是需要在root
权限下。
格式:chgrp 转让的用户 文件名
二.作为文件的拥有者,回收所属组的权限
格式:chgrp 文件的拥有者 文件名
作为普通用户,将文件的所属组给其他用户需要获得那个用户的允许,所以需要在root
权限下进行转让。
但是文件的拥有者回收自己所属组的权限不需要那个用户的允许,在普通用户的模式下就可以进行回收。
( 2 ) (2) (2)同时修改拥有者和所属组(root
权限下才能修改)
格式:chown 修改以后的拥有者:修改以后的所属组 文件名
Linux中的目录权限
Linux
中的目录和文件一样也具有三种权限:
1.-r
读权限:读取目录内文的属性信息。
2.-w
写权限:
如何理解写目录呢?
目录本身的结构就是一棵多叉树,目录和文件之间是具有联系的,相对的在这棵多叉树上创建结点的时候,需要将新结点的地址写入目录
内,这样两者才具有关系。
Linux下进入目录需要什么权限
什么是进入目录:
进入目录的本质就是切换用户的当前路径
答案:进入目录需要x
权限。如果没有x
权限则无法进入目录。
在前面我们说了目录具有读权限,但是如果没有x
权限,具有读权限,能正常读取到目录内文件/目录的属性吗?
在Linux下进行验证:
发现没有x
权限的情况下,读取目录最多只能读取到目录内文件/目录的名字。
我们再次思考读取目录:读取目录是不是应该先进入目录,如果进入不了目录,当然也就是读取不了目录内目录/文件的属性。
但是为什么写目录不需要x
权限呢,
写目录的本质就是在目录这棵多叉树上创建新的结点,并且将新的结点的地址写入到目录上,所以并不需要进入目录的x
权限。
粘滞位
在学习什么是粘滞位之前,我们先看下面的几个需求。
(1)需求一:在Fengli
用户下,删除myfile
文件。
删除成功,这个需求我们是能理解的。因为myfile
属于Fengli
的文件,并且Fengli
作为other
具有w
权限。
(2)需求二:在Fengli
用户下,删除root
的file.txt
文件。这个需求就有点逆天了,竟然想删除其他用户的目录,我们试试看能不能删除成功。
结果竟然删除掉了,root
自己的文件竟然被其他人删除了,如果是竞争对手,那就完了。因此有了粘滞位的出现。
对于粘滞位我们需要知道他的作用:
我们可以给一个目录的other
用户类别打上粘滞位(只有目录能附加粘滞位)
:在附加粘滞位以后的目录打上粘滞位以后的,
1.root
能够进行删除
2.目录的拥有者能够删除
3.文件的拥有者能够删除
ps::粘滞位技术也就是给other
用户类别赋予t
权限。
为什么具有粘滞位呢?
一个other
类别,想要删除目录的文件需要w
权限,这时就需要为other
开设w
权限。这就导致其他人能够删除自己的文件。如果要防止别人删除自己的文件,就不能分配w
权限。
两者本身就是矛盾的,因此有了粘滞位的出现。
粘滞位还具有其他的工作场景:
在根目录
下,有一个tmp
目录,我们一般称之为临时目录。
临时目录内一般放一些临时数据。
并且该临时目录的创建者一般是root
。
在公司中,我们可能多个人使用同一台云服务器,在处理数据的过程中难免都会产生临时数据。临时数据如果随意存放就可能导致系统的数据存放非常乱。因此一般讲临时数据放在临时目录tmp
中,但是如果其他用户误操作就会导致自己的临时数据被删除。
因此我们可以设置粘滞位技术,就可以防止这种情况的出现。
八进制表达权限
在Linux
中,用户类别对应的权限都是对应的,并且固定的。
rwx
代表该用户类别具有rwx
权限。
-rw
代表该用户不具有r
权限,具有wx
权限。
也就是说-
代表没有对应的权限。
既然权限非黑即白,那么对应权限也可以二进制01
进行表示,0
代表没有对应权限,1
代表具有对应权限。
因此对应权限也可以这样标识:
100:r--
110:rw-
并且因为三位二进制对应一个八进制,因此还可以在二进制的基础上进行升级。
所以多了一种修改权限的方法,也就是使用八进制
权限掩码
大家有没有想过为什么新创建的文件和目录的起始权限是这样的?
其实文件和目录在创建的时候都具有一个起始权限
普通文件的起始权限:666
666
我们很好理解,666
就是缺少了x
可执行权限,因为对于文件我们并不需要x
权限。只需要使用gcc,g++
…将文件编译成可执行文件就好了。
普通目录的起始权限:777
这个也不难理解,三种用户类别都需要能对目录进行读写和进入。
这里我们讲的是文件和目录的起始权限。
文件/目录最终权限=起始权限+权限掩码。
现在我们开始正式进入权限掩码(umask)
对于这个名词我们可以进行简单理解。在umask
中出现的权限在起始权限中都需要对应被减去。
我们举例说明:
在Linux下
,普通用户权限掩码的默认值为:0002(八进制)
(第一个数字0
表示八进制),root用户的权限掩码的默认值为:0022
。
0002
对应二进制的权限为:
000 000 010
而文件的起始权限为:
110 110 110
而在前面的myfie.txt
文件中,其最终的权限为
也就是对应myfile.txt
文件的最终权限-rw,-rw,r--
目录的最终权限也是同理。
对于umask
我们可以进行人为修改从而达到影响最终权限的作用。
格式 umask 权限掩码
在计算机中:
最终权限=(~umask)&起始权限
并且:我们设置的umask
只在本次登录(只对当前登录用户有效)有效。