请君浏览
前言
本专题将介绍关于Linux操作系统的种种,那么基于上一章讲述的是对于命令行一些基础命令的使用,本章将讲解关于Linux中权限的概念。(本章节默认使用的环境是centos 7.8)
1. shell命令及其运行原理
Linux严格意义上说的是⼀个操作系统,我们称之为“核⼼(kernel)“ ,但我们⼀般⽤⼾,不能直接使⽤kernel。⽽是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。例如下图所示
上图便展示了我们操作Linux的大致过程。为什么我们不能直接去使用内核(kernel)呢?反而要通过一个名为shell(外壳程序)的程序,从技术角度上来看,Shell的最简单定义:命令⾏解释器(command Interpreter)主要包含:
- 将使⽤者的命令翻译给核⼼(kernel)处理。
- 同时,将核⼼的处理结果翻译给使⽤者。
对应上图中的操作。与此同时,我们通过shell来与内核进行交互不仅能使我们的操作的变得简单,同时shell可以保护内核,对于一些非法请求以及错误请求,shell可以直接进行拦截,不会去影响到内核。因此shell的作用有两点:
- 命令行解析
- 保护内核
对⽐windows GUI(图形界面),我们操作windows 不是直接操作windows内核,⽽是通过图形接⼝,通过点击,从⽽完成我们的操作(⽐如进⼊D盘的操作,我们通常是双击D盘盘符进行运行)。 shell 对于Linux,有相同的作⽤,主要是对我们的指令进⾏解析,解析指令给Linux内核。反馈结果再通过内核运⾏出结果,通过shell解析给⽤⼾。
那么我们现在所使用的外壳程序是什么呢?我们可以输入命令ps ajx | grep bash
去查看:
可以看到我们现在使用的外壳程序是bash
,那么它与shell
是什么关系呢,其实可以看作一个代表统称,一个代表具体的事物。例如对于冰淇淋,shell
就可以看作是冰淇淋,而bash
就是冰淇淋里边具体的品牌。可以看到,外壳程序不止一种,除了bash
外还有其他,例如sh
等等(了解即可)。
2. Linux权限
2.1 什么是权限
在这里我们需要知道两点:
- 权限是用来限制人的。(人 = 真实的人 + 身份角色)
- 目标事物的属性,也会影响权限
权限 = 角色 + 事物属性(影响你能还是不能去做某件事)
这是我们接下来权限学习的基础。
2.2 Linux中的用户
Linux下有两种⽤⼾:超级⽤⼾(root
)、普通⽤⼾。
- root:超级管理员,几乎不受权限约束 。
- 普通⽤⼾:Linux使用者,受权限约束。
超级⽤⼾的命令提⽰符是#
,普通⽤⼾的命令提⽰符是$
。
切换用户:su指令
那么在Linux中,我们是可以进行身份切换的,例如我们想从root账号切换为普通账号:
我们可以使用su
命令来切换账号,它的语法格式是:su [用户名]
。当我们是root账号时切换为其他账号可以直接切换,但当我们是普通用户切换为其他账号时需要输入对应账号的密码才能切换(需要注意的是在Linux中输入密码不回显):
要从普通⽤⼾hcy
切换到root⽤⼾则使⽤ su root
(root可以省略),此时系统会提⽰输⼊root⽤⼾的密码。
我们通过su
切换用户并不会改变我们当前所在路径:
若是想要在切换用户的同时进入该用户的家目录需要在使用su命令时加上-
:
其实这就相当于我们退出当前用户重新登录。当我们切换完用户想要退回切换之前的用户可以直接使用快捷键ctrl + d
或者指令exit
来进行回退操作:
指令提权:sudo指令
当我们不是root账号却想执行只有root账号才有权限干的事情的时候,我们可以通过sudo指令来以root身份去执行一条命令。那么在什么场景下我们会需要用到指令提权呢(只限于普通用户,root本来就是最高权限,不需要提权)?在一些我们当前用户没有权限的地方,这些在下面的讲解会有体现。但是sudo指令并不是想用就能用的,例如我们现在用sudo对一条指令提权:
可以看到,我们失败了,这是因为不是随便一个用户都可以进行指令提权的,只有该用户在sudoers file
中进行相应的设置后才可以使用sudo,我们可以把这个文件理解为一个白名单,只有被添加到白名单的用户才能使用sudo命令进行指令提权,不然任何一个用户都能行驶root的权限那就乱套了,同理,只有root才能对这个所谓的白名单进行修改。至于如何添加到白名单中,因为我们现在还没有学习vim等编辑器,因此无法进行相应的操作,不过在后面的章节中会一步一步带大家进行操作。
2.3 文件属性和访问权限
之前我们说过,在Linux中一切皆文件。那么在对于Linux中的用户对于每一个文件划分为三个角色:
- 文件拥有者(user):文件的创建者。
- 文件所属组(group):与文件拥有者处于同一组的用户。(可以理解为在工作或者学习中若干个人组成的小组,共同完成某个目标)
- 其他(other):既不是文件拥有者也不是文件所属组的用户。
这些角色也可以称之为Linux用户的身份。
下面我们再来来看一看文件的属性,这次为大家详细地解释每一列的含义:
我们从后往前一一来解释,我们以text.txt
文件为例:
test.txt
:最后一列很明显,代表的文件的名字。Mar 17 21:50
:倒数第二列代表的是文件的修改时间。0
:倒数第三列代表的是文件的大小。root
:倒数第四列代表的是文件的所属组,一个人自己也是一个所属组,每一个所属组的名字一般都是该组第一个人的名字。root
:倒数第五列代表的是文件的拥有者。1
:至于倒数第六列我们暂时先不讲解,涉及的东西过多。
对于后面的几列是文件的普通属性,相信大家已经理解,接下来我们来详细讲解第一列。对于第一列,也就是我们权限部分最为重要的一部分,我们详细来说:
第一列一共有十个字符,其中第一个字符我们之前讲过,代表的是文件的类型,而后面的九个字符,每三个为一组,分别代表Linux中三个角色的对于该文件相应的权限。
我们先来看第一个字符,第一个字符代表了文件类型,下面是常见的文件类型(目前阶段了解即可):
d
:目录文件-
:普通文件c
:字符设备文件。显示器&&键盘(我们每打开一个终端,便会出现一个字符设备文件,也就是下图以数字为名的文件)b
:块设备文件。磁盘p
:管道文件。管道分为匿名管道和命名管道,我们之前讲的管道操作就是匿名管道,没有文件实体;这里的管道文件也就是命名管道,主要用于进程间通信。l
:链接文件。类似于windows下的快捷方式
上面了解了第一个字符代表的文件类型之后,我们再来看看后九个字符所代表的角色权限:
其中,每三个为一组,一共分为三组,从前到后依次对应着拥有者、所属组、other的权限
- 每组字符中的第一个字符:如果为
r
代表了有**读取⽂件内容的权限 **,为-
则没有。 - 每组字符中的第二个字符:如果为
w
代表了有**修改⽂件内容的权限 **,为-
则没有。 - 每组字符中的第三个字符:如果为
x
代表了有**执⾏⽂件的权限 **,为-
则没有。
2.4 文件访问权限的设置
chmod指令
我们如果想要看看不同权限下都能做哪些事情,首先我们要先能够改变权限,那么这里介绍一个指令chmod
,它能够改变对应文件的权限,它的语法格式:chmod [权限值] [filename]
,这里需要注意的是,只有文件的拥有者以及root用户才能改变对应文件的权限,也很好理解,我的东西我做主,至于root账号,把它看做神就好了,是一个无赖,不受权限的影响。
接下来是权限值的讲解:
- 用户字符:
u
(使用者权限)、g
(所属组权限)、o
(其他用户权限)、a
(所有人权限) - 权限字符:
r
(读权限)、w
(写权限)、x
(可执行权限) - 若是想要添加某个用户的权限,用chmod 用户字符+权限字符,例如给拥有者加上可执行权限:
chmod u+x filename
- 若是想要删除某个用户的权限,用chmod 用户字符- 权限字符,例如给拥有者加上可执行权限:
chmod u+x filename
- 权限值可以在一次命令中使用多次,例如:
chmod u+rw,g-r,o-rwx filename
现在我们已经知道如何修改权限了,那么接下来让我们来看一看有和没有对应的权限所带来的结果:
对于text.txt
文件,根据上面所讲,我们知道对于拥有者和所属组具有r、w的权限,对于other只有r权限,下面我们可以看到,有r权限时,我们hcy用户也就是拥有者可以查看文件的内容,而当我们去掉r权限时,我们就无法查看文件的内容:
到这里相信大家都会有一个疑问:虽然hcy作为拥有者没有相应的权限,但是它的所属组相应的权限还在,为什么不能查看呢?这是因为在Linux中权限只会按照user、group、other的顺序身份匹配一次,也就是说我的身份与拥有者匹配成功之后便只会与第一个匹配成功的身份的权限绑定。这也就解释了上图中我(hcy)虽然也属于后面的所属组,但是权限只与拥有者相同。
上图中可以看到,当我们具有w权限时,可以向文件中写入,修改文件的内容。但是没有w权限后,我们就不能对文件的内容进行修改。在这里如果说我没有相应的权限,但是我仍想执行对应的操作就可以使用sudo进行指令提权(前提是该用户在“白名单”中)。
观察上图,可以发现虽然我们更改了test.txt
文件的x权限,使它变成可执行文件,那为什么执行时会失败呢?这又有回到我们上面所讲的:权限 = 角色 + 事物属性,目标事物的属性也会影响权限。
对于test.txt
文件,它本身就没有可执行的属性,哪怕我们给它可执行的权限,它也不能够被执行。在Linux中能够被执行需要两点:
- 真的是一个可执行文件。
- 可执行权限
也就是说我们要在Linux执行一个文件,除了这个文件本身就可以被执行,除此之外还需要执行该文件的用户具有对该文件的可执行权限。这也就意味着是否有权限不会影响文件本身的性质,只会影响某个用户是否可以对文件进行相应的操作。
对于上图中的九个位置,每个位置上对应着相应的权限,也就是说r代表着该权限为是,-为否,因此我们也可以看作r为1,-为0,这样一来,九个位置,每个位置我们都可以看做成一个二进制数,同时对于每三个位置,我们可以得知最大即为111,也就是说每个权限都有,最小为000,没有任何权限。因此我们可以把这九个位置看成一个三位的八进制数,例如上图中的,我们可以看作110110100,转换为八进制也就是664,这就是对于权限的八进制表示,由此我们可以使用chmod指令后面直接跟对应权限的八进制表示,例如:
因此对于修改文件的权限我们有两种方法:
chmod u/g/o/a +/- r/w/x filename
chmod 八进制 filename
两种方法都可以修改文件权限,大家根据自己的喜好进行选择。
chown、chgrp指令
上面我们讲解了修改文件对于不同角色的权限,那么文件的拥有者和所属组我们能否进行修改呢?答案是可以的。我们可以通过chown指令来修改文件的拥有者,通过chgrp指令修改文件的所属组。光从字面意思上我们就可以知道更改拥有者与所属组并不是一般人可以做到的,因此想要使用这两个指令去进行更改只能使用root去操作或者使用sudo进行指令提权。
- chown格式:
chown ⽤⼾名 ⽂件名
例:chown lxy test.txt
- chgrp格式:
chgrp 组名 ⽂件名
例:chgrp lxy test.txt
2.5 目录权限
虽然在Linux中一切皆文件,但是目录文件与其他文件的权限所代表的东西有些不同。这里不再卖关子,直接告诉大家在目录文件中相应权限所代表的东西:
- r(可读权限):如果目录没有可读权限,则无法使用
ls
等指令查看目录中的文件内容。 - w(可写权限):如果目录没有可写权限,则无法在对该目录中的文件进行修改文件的操作,例如删除、创建、修改文件名等等。
- x(可执行权限):如果目录没有可执行权限,则无法cd进入到目录中。
目录权限的注意事项:
- ⽬录的可执⾏权限是表⽰你可否在⽬录下执⾏命令。
- 如果⽬录没有 -x 权限,则⽆法对⽬录执⾏任何命令,甚⾄⽆法 cd 进⼊目录, 即使⽬录仍然有 -r 读权限
- ⽽如果⽬录具有 -x 权限,但没有 -r 权限,则⽤⼾可以执⾏命令,可以 cd 进⼊⽬录。但由于没有⽬录的读权限,所以在⽬录下,即使可以执⾏ ls 命令,但仍然没有权限读出⽬录下的⽂档。
2.6 缺省权限
不知道大家有没有发现一个问题,就是我们创建的文件和目录的初始权限是不同的,但它们是固定的。这是因为在Linux中有一个缺省权限(这里的缺省和C++中的缺省是一个意思),它是以八进制显示的。在Linux中:
- 普通文件的起始权限为666, 目录文件的起始权限为777
- 缺省权限(最终权限)= 起始权限&(~umask)
我们一个个来解释,umask被称为权限掩码,我们的缺省权限也就是创建出来后的默认权限等于起始权限按位与上权限掩码的按位取反。
什么是权限掩码呢?我们可以通过修改权限掩码来达到修改Linux文件缺省权限的问题。
我们可以通过umask指令来查看和修改权限掩码:
我们可以看到,在普通用户下默认的权限掩码是0002,root默认的权限掩码是0022。我们不需要考虑第一位,只用看后三位即可。这里我们新建一个文件,上面我们知道,普通文件的起始权限是666,此时权限掩码为002,经过下图的计算:
例如我们修改权限掩码为777:
此时我们再新建一个文件
由此可见,通过修改权限掩码,我们便可以根据自身的需求去设置相应的缺省权限。
2.7 粘滞位
在上面我们讲解目录权限时,不知道大家是否发现这样一个问题,只要用户具有目录的写权限(w),用户就可以删除目录中的文件,而不论这个用户是否具有这个文件的任何权限。这看起来并不科学,就好比我创建的文件凭什么你可以删除呢?这个问题存在与共享目录中:Linux的多用户下,对于文件的访问是隔离的:
那么当我们想让Linux下不同的账号用户共享一个文件该怎么呢?由于文件的访问是隔离的,所以共享的文件不能在任何一个普通账号的家目录里面,只能在其他目录下,这个目录首先不能在任何一个普通用户的家目录下,其次需要对other开放权限,这样做就会出现上述的情况,在共享目录下任何人都可以删除任意的文件,只要有该目录的w可写权限。为了解决这个问题,Linux中提出一个概念:粘滞位:
在Linux的根目录下系统有一个专门的共享目录,它的other权限的最后一位可执行权限上是t
,这就是粘滞位。任何普通用户在设置了粘滞位的目录下都只能删除自己的文件,不能删除他人的。同时粘滞位只能给目录设置,不能用于普通文件。当⼀个⽬录被设置为"粘滞位"(⽤chmod +t
),则该⽬录下的⽂件只能由以下三种用户删除:
- 超级管理员(root)
- 该目录的拥有者
- 该文件的拥有者
尾声
关于权限的讲解就到此结束了,若有纰漏或不足之处欢迎大家在评论区留言或者私信,同时也欢迎各位一起探讨学习。感谢您的观看!