本篇文章,我主要和大家分享与权限相关的知识。本篇文章包含shell命令以及运行原理、Linux环境下的用户分类及权限等知识。

shell命令以及运行原理

shell最简单的定义就是命令行解释器

前面,我们一直使用各种指令进行操作。每当我们执行完一个指令,就会出现类似下面的字符串。

Linux下的权限是什么?_粘滞位

这一串字符串是什么意思呢?从左往右,依次是用户名,主机名,当前目录,命令提示符。它们再加上几个间隔符,就组成了bash命令行解释器。命令行的后面,就是我们输入的指令。

我们输入的指令,在bash(shell的一个具体形式。类似于人有很多种,而黄种人只是人中的其中一种)命令行看来就是一串字符串。还记不记得,我们前面说过,指令的本质,就是编译好的程序或脚本,一定会在系统特定路径存放。bash解释器,就会处理你输入的这一串字符串,匹配系统中相应的程序或脚本进行运行,给你返回结果。

总结下来,就是下面这样:

Linux下的权限是什么?_粘滞位_02

那这个命令行解释器有什么用呢?

我们所有的指令,最终都要在OS的内部运行。但是,直接使用OS比较难,用户无法直接与OS打交道。于是,就有了命令行解释器。把用户的命令解释给操作系统,同时,把结果反馈给用户。

这样一来,用户、命名解释器与操作系统就有了一个明确的关系。用户和操作系统的每次交流,都需要命令解释器作为中间人。

这样有什么好处呢?命令解释器的存在,保护了OS(操作系统),对于用户的非法请求,可以直接拦截。

总结下来,就是下图这样:

Linux下的权限是什么?_Linux中权限_03

除了bash命令行解释器,还有sh命令行解释器。在windowns环境下,图形画界面就相当于了命令行解释器。  

前面,我们说到bash命令行解释器的第一个部分表示用户名。

Linux下的用户分类

在Linux环境下,用户的分类有root用户和普通用户。

root用户,也称之为超级用户,它基本上不受权限的约束。

普通用户,也就是我们用adduser指令,新建的用户。它受到权限的约束。

普通用户想切换成超级用户root,可以使用su指令,即可由普通用户提升变成超级用户。

下面我们来用一下su指令:

Linux下的权限是什么?_Linux中权限_04

当我们输入完su指令后,再输入完root账号的密码,我们成功的由普通用户common_108提升成了root用户。

Linux下的权限是什么?_粘滞位_05

从图中,我们还不难发现,普通用户的命令提示符是$符号,而超级用户root的命令提示符是#。

上面讲述了,我们如何去变成超级用户。下面我们来看看,由超级用户变成普通用户。

Linux下的权限是什么?_粘滞位_06

首先,我们先说说第一种情况。

刚刚我们由普通用户变成超级用户。在这种情况下,我们想变回刚刚的普通用户common_108。有两种方式:一是ctrl+d。二是输入exit指令。

Linux下的权限是什么?_遮掩码umask_07

第二种情况,就是我们原本就是超级用户。我们想变成一个普通用户,体验一下被权限约束的感觉。这时,我们同样需要使用su指令,与刚刚不同的是需要加上普通用户的名称(想变成的用户的名称)。

假设存在一个普通用户叫zhuzhu,我们现在使用su指令变成它。

Linux下的权限是什么?_遮掩码umask_08

使用完su指令后,我们就变成了zhuzhu这个普通用户。

在这里,不知道,大家有没有注意到。在我们使用su指令由普通用户变成超级用户root时,需要密码。但由超级用户变成普通用户不需要密码。这是什么原因?还记得我们刚刚说的吗?超级用户不受权限的约束,也就是它想是谁就是谁。

Linux环境下,我们也可以像windowns环境下那样,安装各种软件使用。不过,在Linux环境下,安装软件需要root用户的权限才能进行。而获取超级用户root权限的方式,有两种。

第一种就是由普通用户变成超级用户root。第二种就是使用sudo,向root提权执行某一条指令。

我们分别用common_108和zhuzhu两个普通用户来执行sudo yum install -y tree指令,安装树这个软件。

Linux下的权限是什么?_Linux的用户分类_09

Linux下的权限是什么?_Linux中权限_10

我们得到了两个不同的结果。common_108用户提权成功,但zhuzhu并没有。这是什么原因呢?

因为我们新建的用户,系统并不信任他们。除非我们将新建的用户加入到白名单中,也就是列为可信任的人。这样,新建的用户,才具有提权的权限。

从刚刚到现在,我们多次提到权限,权限到底是什么?

权限是什么?

权限是指一件事是否被允许去做。

当我们使用ll指令查看文件时,能获得很多的文件属性。

Linux下的权限是什么?_粘滞位_11

这些文件属性中,第一列表示文件的类型。

b表示块设备文件,比如说磁盘文件。

-表示普通文件,比如说文本,可执行程序。

p表示管道文件,这种文件是用来通信的。

d表示目录文件。

c表示字符设备文件,比如说键盘,显示器文件。

在Linux操作系统下,对于一个文件,它是什么类型的,由第一列的符号决定,与文件后缀名无关。这样一来,文件的后缀也就没了直接的意义。虽然文件后缀名没有直接的意义,但不代表不用。

紧跟在第一列后面的九个字符,表示不同身份的人的可读、可写、可执行权限。

w表示可读权限,x表示可执行权限,r表示可读权限,-表示无该权限。

在一些场合,我们常常会看到非工作人员,勿入的字样。如果你是工作人员就可以进去。它根本不管你是谁,只管你的身份是不是工作人员。也就是说,你有没有进入的权限,与你的身份有关。Linux中的权限认证也是如此,它只管你是什么身份,不管你是谁。

小明教小华知识,那小明对于小华,是不是有一个传授知识的身份。此时,小明+刚刚的那个身份就扮演着一个老师的角色。根据这样的一个逻辑,Linux中,衍生出了拥有者,所属组和其他人这三个角色。

前面,我们提到的九个字符,三个三个为一组,从左依次往右,前三个表示拥有者的读写执行权限,中间三个表示所属组的读写执行权限,最后三个表示其他人的读写执行权限。

Linux下的权限是什么?_遮掩码umask_12

这九个字符,每个位置的含义都是确定的,每一组的第一个位置表示写权限,第二个位置表示读权限,第三个位置表示可执行权限。还有就是每一个位置只有是或者否,具有指定的权限。

总结一下,就是下面这样:

Linux下的权限是什么?_shell运行原理_13

我们现在来看看权限的作用:

Linux下的权限是什么?_粘滞位_14

首先,我们先查看当前目录下的文件。从ll指令显示出来的效果看,我们当前路径下,有一个读写执行权限都没有的文件text.txt。

现在,我们尝试使用echo指令,对这个文件进行写入。写入失败,提示说我们没有权限。我们试着使用sudo 提权进行写入,得到了同样的结果。

现在,我们使用su指令由普通用户变成超级用户,再进行同样的操作,我们可以清晰的发现,我们不仅可以向文件写入内容,还可以查看文件里的内容。这是什么原因?因为超级用户不受权限的约束。

下面,我们从超级用户变回普通用户。

Linux下的权限是什么?_遮掩码umask_15

我们发现,权限的限制作用又起效果了。我们无法对该文件进行查看。

权限除了和身份有关,还和事物的属性相关。

我们刚刚说到了普通用户和超级用户,又说到了拥有者,所属组和其他人。这几者是什么关系呢?

拥有者,所属组和其他人相当于一个角色,而普通用户和超级用户就相当于人。人可以扮演多个角色,也就是说,超级用户或者普通用户,既可以是拥有者也可以是所属组,还可以是其他人。

总结下来,就是下面这样:

Linux下的权限是什么?_Linux的用户分类_16

现在,我们懂得了什么权限,见到了权限的作用,对普通用户有限制作用,对超级用户无限制作用。那我们如何去更改文件的权限呢?

权限如何去更改?

权限的更改,需要用到一个新的指令chmod。它有四个选项:

1.u 表示拥有者

2.g 表示所属组

3.o表示其他人

4.+表示增加权限

5.-表示减去权限

6.=表示赋予权限

下面,我们以拥有者为例,使用一下chmod的。

Linux下的权限是什么?_粘滞位_17

首先,通过查看text.txt。它现在什么权限都没有。

Linux下的权限是什么?_遮掩码umask_18

我们使用chmod u+w text.txt,给这个文件的拥有者加上写权限。

Linux下的权限是什么?_Linux的用户分类_19

通过,ll指令查看文件属性,我们就能发现,text.txt文件的文件属性中,拥有者的写权限,变成了w。

删除权限的方式,也是类似的,我们只需要把加号变成减号就可以了。

Linux下的权限是什么?_shell运行原理_20

在权限的增删时,我们也可以同时增加或减去多个权限。只需按照规定好的 chmod 参数 文件名 这样的格式就可以完成多个权限的增删了。

权限的有无实际上,是用1表示有,0表示无的。因此,我们还可以使用二进制码来修改权限。我们举个例子664,6转换成二进制就是110,三位的二进制码刚好对应三个权限,二进制为1就表示具有该权限,所以,6就表示具有读写权限。

通过查看,text.txt文件什么权限都没有。

Linux下的权限是什么?_Linux的用户分类_21

假设我们想让拥有者具有读写权限,也就是110,转换成十进制就是6。而所属组,我们想给予它读权限,也就是100,转换成十进制就是4。对于其他人,我们想给它读和可执行权限,也就是101,转换成十进制就是5。把这三个数字组合到一起,就得到了一个三位数645。

然后,我们按照规定的格式chmod +数字输入指令+文件名。

Linux下的权限是什么?_粘滞位_22

就可以完成对应权限的更改了。

我们来看看下面这种情况:

Linux下的权限是什么?_Linux中权限_23

九个字符后面的数字,我们后面再说。紧跟在数字后面的两串字符,依次是该文件的拥有者和所属组。

Linux下的权限是什么?_Linux中权限_24

从ll指令显示的结果看,我们可以知道,文件text.txt的拥有者和所属组都是common_108。

一开始,文件text.txt什么权限都没有。现在,我们给文件text.txt的所属组,增加一个读权限。

Linux下的权限是什么?_Linux中权限_25

然后,去查看text.txt这个文件。

Linux下的权限是什么?_shell运行原理_26

结果,它说我们没有权限查看。

这是什么原因?

权限在认证的时候,只认正一个。我被认定为文件的拥有者,不具有读的权限。虽然,我也为所属组具有读的权限,但系统认证我为拥有者,不具有读权限,这就导致了上图的结果。

刚刚,我们了解了如何去更改权限。下面,我们来看看,如何去更改拥有者和所属组。

拥有者和所属组如何去更改?

首先,我们得认识两个新的指令chown(change own)和chgrp(change group)。

chown,就是修改文件的拥有者。而chgrp,就是修改文件的所属组。

下面,我们来使用一下这两个指令:

首先,我们先来演示chgrp这个指令。

Linux下的权限是什么?_Linux的用户分类_27

通过ll指令查看,我们可以知道现在text.txt文件的所属组为common_108。

Linux下的权限是什么?_Linux的用户分类_28

然后,我们按照chgrp 用户名 文件名 的格式把文件text.txt的所属组修改给zhuzhu这个用户。

Linux下的权限是什么?_Linux的用户分类_29

结果,它不允许我们修改。这个是操作系统设置缘故。我们需要提权执行我们刚刚的指令,才可以完成所属组的修改了。

同理,如果我们想修改文件的拥有者,也需要提权执行chown 用户名 文件名。下面,我们来看看演示:

Linux下的权限是什么?_Linux中权限_30

好了,现在我们把文件text.txt的拥有者和所属组就都改成zhuzhu了。不知道,你学会没?

来看看下面这张图:

Linux下的权限是什么?_Linux中权限_31

首先,我们创建了一个文本文件和一个目录文件。

通过观察我们可以清晰的发现,这两个文件,一开始的默认权限不同。

Linux下的权限是什么?_Linux中权限_32

普通文件的默认权限是664,目录文件的默认权限是775。

这什么原因?

umask

这和遮掩码umask有关。

一开始,普通文件的权限是666,目录文件的权限是777。它们最终的权限=起始权限&(~umask)。

我们可以通过umask指令查看,当前环境下的umask值。

Linux下的权限是什么?_遮掩码umask_33

通过umask指令,我们发现Linux环境下的umask值为2。

如果你想修改umask的值,只需要在umask指令后面加上对应的数值就行了。比如说我们要修改成1。

Linux下的权限是什么?_遮掩码umask_34

从结果看,我们成功修改了umask值。

下面,我们来看一下最终权限是怎么得到的。

Linux下的权限是什么?_Linux中权限_35

我们都知道目录文件和普通文件是不同的。所以,它的读写权限和可执行权限的含义也与普通文件的读写权限和可执行权限含义不同。

我们都知道目录文件的内容,是各种文件。所以,它的权限自然就与文件有关。

目录文件的读权限,是指我们是否可以查看该目录下有那些文件。

目录文件的写权限,是指我们是否在该目录增加、删除或更改文件。

目录文件的可执行权限,是指我们是否可以进入该目录。

不知道,大家有没有见过共享目录文件的场景。

既然是共享目录文件,那我们肯定具有读写以及可执行权限。

可这样有一个问题。小明在这个目录下创建了一个文件,他没有对小华开放读这个文件的权限。可是小华因为具有目录的读权限,知道这个文件的存在,但小华却查看不了,他很生气。于是,小华就把小明的文件删掉了。

这是不是很荒唐,明明不是小华的文件,他却能删掉。

对于这种问题,怎么解决呢?

能不能直接取消该目录的写权限?当然不能,没了写权限还叫啥共享目录文件。于是,为了解决这类问题,设计者,又增加了一个粘滞位。

粘滞位

它的作用,就是为了防止上面这种问题的发生。在共享目录文件中,不是你的文件,你不能删除。

它用t来表示。

Linux下的权限是什么?_Linux的用户分类_36

具体怎么使用我们在这里就不细说了。

关于目录的问题,还有几个,我们直接一块总结到下图中了:

Linux下的权限是什么?_Linux的用户分类_37

好了,到这里,我们本次的分享就到此结束了,不知道我有没有说明白,给予你一点点收获。关于更多和Linux相关的知识,会在后面的文章更新。如果你有所收获,别忘了给我点个赞,这是对我最好的回馈,当然你也可以在评论发表一下你的收获和心得,亦或者指出我的不足之处。如果喜欢我的分享,别忘了给我点关注噢。