当前位置: 首页 > news >正文

Linux --- 权限

1. 权限的概念及其作用

什么是权限?权限是访问资源能还是不能的问题。为什么存在权限?因为 Linux 是一个多用户的操作系统,同时会有多个人进行登录访问(普通用户和 root ),权限本质是为了更好的进行用户管理

2. 权限的理解

权限我们可以理解为人 + 文件属性,人又分为具体的用户和角色。权限是针对特定群体的,与人有关,并且目标主体必须天然具备对应的属性才能访问。接下来从具体的用户,角色,文件属性来理解权限。

1. 用户

在 Linux 系统当中,它的用户可以分为两类:一类叫做超级用户,一类叫做普通用户超级用户的命令提示符是 “#” ,普通用户的命令提示符是 “$” 。之前我们介绍指令的时候,使用的都是超级用户,接下来加入几个普通用户(zs,ww),使用 adduser 和 passwd 指令完成添加普通用户的操作。需要注意的是基本上超级用户 root 不受权限约束,属于linux 系统中的特殊级别,普通用户受权限的约束。如果是超级用户 root,是可以随意的切换成任何一个用户的,如何切换呢?su 用户名,如下图所示:



所以从 root 账号切换成普通账号的指令为:su 普通用户名

若想要从普通用户切换到root,也可以使用 su 指令 --- su root,只不过会与 root 切换到普通用户有一点区别,如下图所示:



它显示要我输入密码,输入的是谁的密码?输入的是 root 的密码。既然我知道超级用户的密码,那么我不就是管理员吗?我是管理员还需要我输入 root 的密码吗?是的。输入 root 的密码之后,就变成了超级用户。

此外还可以直接 su,也可以切换成超级用户,当然还是需要你输入 root 的密码,如下图所示:



为什么直接 su 就可以切换到 root 账号了呢?因为 linux 系统中 root 账号只有一个

若再想切换为普通用户,可以使用快捷键 --- ctrl + d(从当前账号回退到上一个账号),如下图所示:



接下来看看以下场景:



当我的身份是 ww 时,当前的路径是 /home/ww;当我的身份是 root 时,当前的路径是 /home/ww。 当前所处的路径在切换前和切换后并没有改变。



当我的身份是 ww 时,当前的路径是 /home/ww;当我的身份是 root 时,当前的路径是 /root 。当前所处的路径在切换前和切换后改变了。

对比两图中的切换用户操作的区别,图一切换 root 账号时使用的是 su root ;图二使用的是 su -,并且还显示处理 Last login。对比之下可以知道,切换账号前后的路径发生改变是因为 su –。su – 指令的作用确实是切换用户,但是切换的方式是让目标用户以重新登陆的方式进行登陆。所以在图二使用 su - 指令切换用户,就相当于让 root 重新在系统里登陆一下,登陆之后不仅身份改变了,当前工作路径也跟着改变了。

所以从普通账号切换成root账号的方法为:su root / su / su - + root密码

在linux中可以存在多个普通用户,如果不清楚当前系统中有几个普通用户,可以使用指令 ls /home 来查看:



若想从一个普通用户切换到另一个普通用户应该怎么办?现在我要从普通用户 ww 切换成普通用户 zz ,输入 su 普通用户名即可。如下图所示:



它显示要我输入密码,输入的是谁的密码?输入的是目标普通用户的密码。

所以从一个普通用户1切换到普通用户2的方法为:su 普通用户2的用户名 + 普通账号2的密码

从切换账号的方法不同可以发现,从 root 账号切换到普通账号是不需要密码的,这就是超级用户属于 linux 系统中的特权级别的表现之一。

若我是一个普通用户,我只想做一次提高自身权限的事情,但是又不想将自己的账号切换成 root 或者说不知道 root 的密码,应该怎么做?可以使用 sudo 指令,sudo 是一个对普通账号进行指令短暂提权的命令(提权时间默认为15分钟)。在路径 /home/ww下创建一个914文件夹,在该文件夹中创建一个 test.txt 文件,如下图所示:



查看 test.txt 文件的信息,尽管我们不知道这些信息代表着什么意思,但是我们知道文件的创建人是 ww 。如果想要以 root 的身份在当前的路径下创建一个文件夹或者普通文件,应该怎么办?在 touch 文件名或者 mkdir 文件名的前面加上 sudo 即可,如下图所示:



它显示要我输入 ww 账号的密码,为什么要输入 ww 账号的密码呢?这样岂不是任何人都可以随意的把自己账号的身份提权为 root ?既然这样,root 账号的密码不是形同虚设了吗?如果这里不应该输入 ww 账号的密码,难道应该输入 root 账号的密码吗?如果这里输入的是 root 账号的密码,那么 sudo 指令只能由 root 账号来使用了;然而这样就与 sudo 的作用相违背了,所以这里不应该输入 root 账号的密码,一定输入的是要提权的用户的密码。但是事实与我们想的一样吗?root 账号的密码形同虚设了吗?任意一个用户都可以随意提权了吗?接下来我们输入 ww 用户的密码,输入完毕之后,我们认为 ww 提权了,并在当前路径下生成了 linux.txt 文件,但是实际上是怎样的呢?如下图所示:



观察 ll 指令之前与之后的结果,发现当前路径下并没有生成 linux.txt 文件,并且输入密码之后,显示 ww is not in the sudoers file。实际上普通账号是默认执行不了sudo指令的

在 linux 系统中,实际上存在着 sudoers 文件,如下图所示:



sudoers 文件是超级管理员的权限,任何人是没有办法直接访问这个文件的,只有存在于 /etc/sudoers 文件的可信任用户列表中的用户才能执行 sudo 指令,这个文件是由管理员管理的。若普通用户想要能够执行 sudo 指令,需要管理员将该用户添加到可信任用户列表中。

2. 角色

权限是依附于角色的。Linux 系统中的角色分为:拥有者角色,所属组角色,other角色。查看 test.txt 文件的属性,如下图所示:



第一个 ww 对应的是该文件所对应的拥有者,第二个 ww 对应的是该文件所对应的拥有组。不是还有一个 other 角色吗?other 就是除了拥有者和所属组之外的角色,根本不需要在文件的属性上显示该文件的 other 角色有哪些。

所属组是什么呢?所属组是对文件权限进行局部范围的组级别的管理。拥有者角色和所属组角色与前面的用户有什么关联呢?角色是需要人来扮演的角色与用户之间的关系并不是冲突的而是相互补充的某个用户将来会成为某个文件的拥有者角色和所属组角色

有人可能会想是否可以更改文件的所有者和所属组呢?当然可以。chown 和 chgrp 指令可以做到。chown 指令的功能为:更改文件的所有者,语法格式为:chown 用户名 文件chgrp 指令的功能为:更改文件的所属组,语法格式为:chgrp 用户名 文件

若想同时更改文件的拥有者和所属组,具体指令为:chown 用户名:用户名 文件名,如下图所示:



存在更改 other 角色的指令吗?不存在,根本就不需要专门存在一个指令用来更改 other 角色,对于某个文件来说,other 角色就是除了拥有者和所属组之外的所有用户。之前的操作都是用 root 账号来完成的,下面使用普通账号 ww 来执行上述相同的操作。

将 test.txt 文件的拥有者更改为 zs ,结果如下图所示:



结果显示:changing ownership of ‘test.txt’: Operation not permitted 操作未允许。

将 test.txt 文件的所属组更改为 zs ,结果如下图所示:



结果显示:changing group of ‘test.txt’: Operation not permitted 操作未允许。

由上述两种操作的结果可知,即便我是文件的拥有者和所属组,也不能更改该文件的拥有者和所属组,为什么呢?因为作为文件的拥有者和所属组,更改文件的权限时,与其它用户无关;而现在作为文件的拥有者和所属组,将文件的拥有者和所属组更改为其它用户时,与其它的用户产生了关联,换句话理解将文件的拥有者和所属组更改为其它用户时需要得到其它用户的允许。那么如果普通用户想要将文件的拥有者和所属组更改为其它用户,怎么取得他们的允许呢?需要超级用户的权限,也就是提权

总结:更改一个文件的拥有者和所属组,需要用到超级用户的权限

3. 文件权限属性

文件的基本权限分为三种:r(只读),w(只写),x(可执行)。接下来查看 test.txt 文件的属性,如下图所示:



文件属性的最开头有十个字符,第一个字符表示的是文件的具体类型,剩下的9个字符,每3个为一组,分别表示拥有者权限,所属组权限,other权限。也就是拥有者对于该文件的权限为 rw-,这 rw- 代表什么意思呢?每3个字符为一组,每组的第一个位置表示是否可读,第二个位置表示是否可写,第三个位置表示是否可执行,它们的顺序必须是可读,可写,可执行。如果该位置可读,则表示为r,没有可读权限,则表示为 - ;如果给位置可写,则表示为w,没有可写权限,则表示为 - ;如果该位置可执行,则表示为 x,如果没有可执行权限,则表示为 - 。如何正确的表达一个文件的权限:分别列举拥有者,所属组,other有什么权限,如上图中 test.txt文件的权限表达为:拥有者ww 拥有可读,可写权限,没有可执行权限;所属组 ww 拥有可读,可写权限,没有可执行权限;other 只有可读权限,没有可写,可执行权限。

我们能够看见角色对于某个文件的权限,那么是否可以更改权限呢?当然可以。我们先往 test.txt 文件中写入一点内容(hello linux),接下来尝试修改文件的属性,需要注意的是只有文件的拥有者和超级用户才能更改文件的属性,更改文件属性所用到的指令为 chmod

chmod 命令权限值的格式分为两种:用户表示符 +/- 权限字符,三位8进制数字。

先介绍第一种格式:用户表示符 +/- 权限字符。其中 + 的作用是增加权限,- 的作用是取消权限;用户符号共有4个:u --- 拥有者,g --- 所属组,o --- 其他角色,a --- 所有角色

若想去掉拥有者对 test.txt 的可写权限,具体指令为: chmod u-w test.txt,如下图所示:



更改之后原来的 rw- 变成了 r--,验证是否去掉了拥有者对 test.txt 的可写权限,如下图所示:



若想去掉拥有者对 test.txt 的可读可写权限,具体指令为: chmod u-rw test.txt,如下图所示:



写成 rw 或者 wr 没有区别,都可以达到目的。

若想给拥有者和所属组加上对 test.txt 的可读可写权限,具体指令为:chmod u+rw,g+rw test.txt,如下图所示:



若想要给 other 加上对 test.txt 的可写权限,去掉可读权限,具体指令为: chmod o-r+w (无先后顺序) test.txt,如下图所示:



若想要去掉所有角色对 test.txt 的所有权限,具体指令为: chmod a-rwx test.txt,如下图所示:



下面来介绍 chmod 命令权限值的另一种格式 --- 三位8进制数字。之前说过,每3个字符为一组,由 rwx 这种权限表示方法,我们可以知道,一个位置最多表示两种状态。现在将可读,可写,可执行记为1;不可读,不可写,不可执行记为0,所以我们可以将每组的3个数字看成8进制,111表示7,000表示0。若提到某个角色的权限为7,则说明该角色拥有可读,可写,可执行权限;推而广之,一个角色的权限为7,那么三个角色呢?就为777。

若想要去掉所有角色对 test.txt 文件的所有权限,具体指令为: chmod 000 test.txt,如下图所示:



若只想保留所有角色对 test.txt 文件的可读权限,具体指令为: chmod 444 test.txt,如下图所示:



如果 chmod 指令的后面只跟了2个数字,第一位默认补0,如下图所示:



如果 chmod 指令的后面只跟了1个数字,第一二位默认补0,如下图所示:



下面来看一个场景,将用户切换为 root ,如下图所示:



从上图可以发现 test.txt 的拥有者,所属组均为 ww ,那么 root 不就是 other 了吗?我们再看 other 对于 test.txt 的权限,只有可读权限,没有可写和可执行权限,下面往 test.txt 文件中写入 “hello linux” 内容,观察是否成功?结果如下图所示:



咦?root 不是属于 other 角色吗?不是没有可写权限吗?为什么可以往 test.txt 文件中写入内容?因为 root 账号不受权限的限制,只有普通用户受权限的限制

下面再来看一个场景,将用户切换为 ww ,去掉拥有者对于 test.txt 的所有权限,再查看 test.txt中的内容,会发生什么?如下图所示:



由上图可以知道,拥有者的对于 test.txt 的所有权限都没有了,所以不能查看 test.txt 中的内容。但是 ww 即是拥有者,也是所属组呀,所属组拥有对 test.txt 文件的可读权限呀?为什么不能以所属组的身份查看 test.txt 文件中的内容?因为用户访问文件时,确定自己对于文件的身份角色,只会验证一次;也就是说,权限只会验证一次。接下来直接证明权限只会验证一次:将 test.txt 文件的拥有者改变,使用 chown 指令更改文件的拥有者,先将用户切换为 root ,再将 test.txt 文件的拥有者更改为 zs ,如下图所示:



接下来将用户切换为 ww ,看看是否可以查看 test.txt 文件中的内容,结果如下图所示:



拥有者为 ww 时,ww用户不能访问 test.txt 文件中的内容;现在拥有者为 zs ,ww用户就可以访问 test.txt 文件中的内容了。再将所属组对于 test.txt 文件中的所有权限去掉,看 ww 用户是否还能查看 test.txt 中的内容,结果如下图所示:



ww 用户不能访问 test.txt 文件的内容了。由以上三种不同的结果就直接证明了权限只会验证一次。

接下来具体的谈谈可执行权限,增加拥有者 ww 对 test.txt 的所有权限:



现在拥有者对 test.txt 文件具有可执行权限,那么用户 ww 是否可以运行 test.txt 文件呢?如下图所示:



由结果可知,用户 ww 并没有将 test.txt 运行起来,这是为什么呢?一个文件能运行起来需要具备两个要素:1.该文件本身就是一个可执行的二进制文件;2.文件本身具有可执行权限。只有该文件既是可执行的二进制文件,也具有可执行权限,才能运行起来。让文件执行不等于文件能执行,文件最后是否能够被执行,还得要看它是否为可执行文件。

总结:给文件可执行权限,不是让用户执行,而是当用户想执行的时候,系统允许用户执行

之前曾说过文件属性的开头字符表示的是文件的具体类型,其中 – 表示普通文件(源代码,文本,动静态库,可执行文件等等),d 表示目录;l 表示链接文件;p表示管道文件 ;c 表示字符设备文件(常见的字符文件就是键盘,显示器),它按照顺序输入输出,不支持随机读写;b 表示块设备文件(常见的块设备文件就是磁盘),它支持随机读写,以块为单位(块的大小一般是4KB)。

3. 有关权限的问题

1. 如果要进入一个目录需要什么权限?

在普通用户 ww 中的 914 文件夹中创建一个 linux 目录,如下图所示:



现在我若想进入这个Linux目录,需要什么权限?是 r ?是w?还是 x ?我们一个个来排查。

先去掉拥有者对 linux 的r 权限,观察有怎样的结果,结果如下图所示:



去掉 ww 对 linux 的 r 权限之后,拥有者仍能进入 linux 文件,只是不能查看该目录中其它文件的属性了,但是仍然可以在该目录中执行 touch mkdir 等指令。所以 r 权限在目录中的具体功能是:用户是否有权利查看指定目录下其它文件的属性

加上 r 权限,再去掉 ww 对 linux 目录的 w 权限,观察有怎样的结果,结果如下图所示:



去掉 ww 对 linux 的 r 权限之后,拥有者仍能进入 linux 文件,只是不能在该目录中执行 touch mkdir 等指令了,但是仍然可以查看该目录中其它文件的属性。所以 w 权限在目录中具体的功能是:决定了特定用户是否有权利在该目录下新增,删除和修改文件

进入到 linux 目录中,执行如下图所示的操作:



目录linux没有 w 权限,所以不能修改该目录下文件的属性,如果想要修改该文件本身(写入数据和读取数据),那么是否有这个权限与目录没有关系,与文件本身有关。可以从另一个知识的角度去理解这句话:之前曾说过 linux 系统下一切皆文件,文件 = 内容 + 文件的属性 ,目录也是文件,目录也有自己的内容和属性,那么目录的内容是什么?我们可以暂时认为目录的内容就是当前目录下文件的属性(之后会更正该知识),那么是否就能理解为什么目录没有 w 权限之后,便不能在该目录下新增,删除和修改文件?因为一旦新建文件,就需要将新建文件的属性保留到目录中,但是目录没有 w 权限,自然就不能保存新建文件的属性,也就不能新建文件了,删除和修改文件与之同理。

加上 w 权限,最后去掉 ww 对 linux 目录的 x 权限,观察有怎样的结果,结果如下图所示:



去掉 ww 对 linux 的 x 权限之后,拥有者就不能进入 linux 文件了,所以要进入一个目录,需要 x 权限

2. 为什么新建目录和新建普通文件的初始权限是775和664?而不是其它?

将 linux 目录的权限恢复原样,并且新建一个普通文件 hello.txt,如下图所示:



linux 目录和 test.txt 文件都是新建的,但是为什么目录的初始权限就是775呢,为什么普通文件的初始权限就是664呢?为什么不是其它?对于普通文件,起始权限都是从 666 开始的对于目录文件,起始权限是从 777 开始的。但是不是说 linux 系统下一切皆文件吗?同样都是文件,为什么目录的起始权限就要从777开始,普通文件的起始权限就要从666开始,777和666之间的区别在于是否有 x 权限,而之前所过进入一个目录需要 x 权限,所以目录默认拥有 x 权限是合理的;对于普通文件,系统是默认普通文件是不需要可执行权限的,如果需要用户自己加上即可。

即使是上述所说的那样,可是目录和普通文件最终权限显示的是775和664呀?这又是怎么一回事呢?linux 系统中,为了对权限进行细粒度控制,加入了linux权限掩码。查看自己系统的权限掩码,使用 umask 指令,如下图所示:



有些人的权限掩码可能会与我的不一样,这都是正常现象。介绍了怎么查看权限掩码之后,那么权限掩码的作用是什么?凡是出现在权限掩码中的权限,最终都应该在起始权限中去掉,所以最终得到最终权限的计算公式:最终权限 = 起始权限 “去掉” umask 中出现的权限

接下来回答之前提出的疑问,为什么新建普通文件的最终权限是 664 ?因为普通文件的起始权限是从 666 开始,666 以8进制表示为:110 110 110,002 以8进制表示为:000 000 010,起始权限 666 去掉 umask 中出现的权限 002 ,最终权限为 110 110 100,也就是664;为什么新建目录的最终权限是775?因为目录的起始权限是从 777 开始,777 以8进制表示为:111 111 111,002以8进制表示为: 000 000 010,起始权限 777 去掉 umask 中出现的权限 002 ,最终权限为 111 111 101,也就是775。

公式中的去掉不能单纯的理解成减法,真实的公式为:最终权限 = 起始权限 & (~umask) (&计算逻辑:有0则0,同1则1)。拿普通文件来理解该公式,umask 以8进制表示为 000 000 010,取反 ~umask :111 111 101,普通文件的最终权限的8进制表示为 110 110 110,110 110 110 & 111 111 101,最终运算结果为:110 110 101,也就是664。

既然最终权限与 umask 的值有关,那么如果我改变 umask 的值,最终权限是不是就会发生改变?是的,如何更改?具体代码为:umask 更改的权限掩码,如下图所示:



新建的目录,普通文件的初始权限变成了777和666。有人可能会担心,将 umask 的值更改之后,我忘记了 umask 原来的值,怎么办?不需要担心,当退出云服务器再重新登陆,umask 会恢复为原来的值。

3. 粘滞位

在指定目录下,一个其他用户(即便是 root )在我当前用户中新建的文件,不给我这个用户 rw 权限,但是我们可以删掉这个新建的文件。实际上普通用户的家目录只对该用户开放,其他用户没有任何权限,如下图所示:



所以其他用户在别的用户中新建文件,是不可能发生的(root除外)。如果想让多个用户共享一个文件,应该怎么做?可以知道的是这个共享文件一定不能在任意用户的家目录下,一定在系统级的路径下在一个共享目录下,将我新建的文件和其他用户共享,其他用户可以删我新建的文件。如果我在共享目录下新建的文件,既想可以和其他用户共享,又不想让除了我和root之外的用户删除该文件,那该怎么办?可以使用粘滞位,+t ,这个 t 就是粘滞位,加上了粘滞位的文件的 other 的x 位置就变成 t 。粘滞位是什么?它是给 other 设置的一种权限管理级别;它的特征是:在指定带了粘滞位的目录下,每个人新建文件在删除的时候,只能自己删自己的,不能因为目录 w 权限的问题,删除别人的文件;所以粘滞位通常用来做文件共享的场景

之后在学习 linux 操作系统时,最好使用普通用户,这样在执行某些命令的时候,不会因为是 root 用户,而忽视了一些细节。


文章转载自:

http://FE7f1APC.nzsdr.cn
http://PS8M95rV.nzsdr.cn
http://zX6VWOIY.nzsdr.cn
http://QUMtlJ8J.nzsdr.cn
http://Bbao4DbB.nzsdr.cn
http://EYTD5UQq.nzsdr.cn
http://Sh56nrSN.nzsdr.cn
http://pgW9Wjxq.nzsdr.cn
http://jhuHy9UW.nzsdr.cn
http://RVFNUAnt.nzsdr.cn
http://4GcELXyp.nzsdr.cn
http://pw0tlDIj.nzsdr.cn
http://780ov9S3.nzsdr.cn
http://TzNpVZl1.nzsdr.cn
http://E9SaMQLq.nzsdr.cn
http://ppPYNQji.nzsdr.cn
http://7QPGE4fD.nzsdr.cn
http://amfVADhx.nzsdr.cn
http://C6NvjWdu.nzsdr.cn
http://KhaLmiP4.nzsdr.cn
http://ozWPLDjE.nzsdr.cn
http://YFCB2qse.nzsdr.cn
http://saCOyGvG.nzsdr.cn
http://sa5wPbc8.nzsdr.cn
http://1UG2ydbS.nzsdr.cn
http://qLYQOGlQ.nzsdr.cn
http://9CABUtCP.nzsdr.cn
http://tSLzEHvv.nzsdr.cn
http://0hgmzG57.nzsdr.cn
http://t0NOrQb1.nzsdr.cn
http://www.dtcms.com/a/387229.html

相关文章:

  • netty集成protobuf
  • ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务
  • io_uring最简单的实例io_uring-test.c分析
  • 15.Linux时间管理
  • Linux 系统中的 Crond 服务:定时任务管理全指南
  • JDBC学习笔记
  • LoRA翻译
  • Linux 内存管理章节十五:内核内存的侦探工具集:深入Linux内存调试与检测机制
  • Mysql-主从复制与读写分离
  • bevformer 網絡結構
  • MySQL 基础与实战操作
  • 系统架构设计(二)
  • 【Day 58】Redis的部署
  • UVM验证工具--gvim
  • 《C++ spdlog高性能日志库快速上手》
  • 代码随想录学习(二)——二分查找
  • 【代码随想录day 27】 力扣 53. 最大子序和
  • Zynq开发实践(SDK之第一个纯PS工程)
  • 【Spring生态】Spring Cloud
  • HarmonyOS应用拉起系列(三):如何直接拉起腾讯/百度/高德地图进行导航
  • Redis的主从库与切片集群机制
  • 打工人日报#20250916
  • WASM逆向
  • 如何计算最大公约数和最小公倍数
  • 我们设计时间戳的更新时间的时候通常将字段类型设置为int或者bigint 这样能避免2038的问题吗
  • 超越“防被告”:2025跨境电商IPR战略赋能与品牌升值之道
  • Scrapy进阶:POST请求模拟登录实战与管道的使用
  • Zabbix 7.0 配置钉钉告警
  • 知识拓展-智能体和数字人
  • 飞牛NAS部署影视站MooncakeTV