Linux:权限


用户

所谓权限,就是通过一定条件来拦住一部分人,让另外一部分人访问资源的权利。简单来说,就是能与不能的关系。那么毫无疑问,权限会与人有关,我们先来看看Linux中有那些种类的用户。

在Linux中,只存在两种用户:

root:超级管理员
user:普通用户

root用户在Linux中几乎无所不能,甚至可以把整个根目录给删掉,因此十分危险。那么我们要如何在Linux中创建普通用户?

创建用户

指令adduser+用户名,即可创建一个用户:

在这里插入图片描述

以上代码就创建了一个名为me的用户,我们可以到/home目录下查找当前存在的用户:

在这里插入图片描述

随后我们要为这个用户设置密码,指令为passwd + 用户名:

在这里插入图片描述

随后输入你的密码即可,一般来说Linux会向你确认两次密码。

如果你想要删除一个用户了,则用指令userdel -r + 用户名:

在这里插入图片描述

此时我们再去/home目录下查找,就找不到该用户了。这里不要漏掉-r选项,不然会有用户的残留文件,下次创建相同名字的用户时,有可能就会创建失败了。

创建好用户后,我们要如何进行用户的切换呢?

用户切换

su xxx变为xxx用户,比如我现在要从root变为一个名为box-he的用户:

在这里插入图片描述

其中,whoami指令可以输出当前的用户名。

从以上图片可以看出:

  1. root用户变为普通用户无需密码
  2. root状态下,命令行末尾是#user状态下,命令行末尾是$

现在再尝试从普通用户变为其它普通用户,我这里从box-he变为hxy用户:

在这里插入图片描述

可以看到:普通用户变为普通用户,是需要密码的

那么普通用户可以变成root用户吗?也是可以的,有两种方式:

指令su,暂时提升为root用户:

在这里插入图片描述

该方法提升为root有以下特点:

  1. 提升为root后,工作目录不会改变
  2. 是临时性的提升,可以通过ctrl + D退出当前状态

另外一种方式为su -,该方法则是切换为root用户:

在这里插入图片描述

该方法提升为root有以下特点:

  1. 提升为root后,工作目录会变成root的家目录
  2. 是用户的转变,相当于用root身份重新登陆了一次

不过Linux的权限远远不止取决于这个用户是谁,在学校中,你可以进入学校的大门,因为你是学校的学生;在餐馆中,你可以享受美食,因为你是消费者;在电视上,你可以跳过广告,因为你是VIP。可见你能不能享受一个服务,并不取决于你是谁,而取决于你在该环境下的身份


文件的权限

身份

在Linux中,对于任意一个文件,都只有三种身份:拥有者own所属组group其它other。而这个身份,我们可以直接通过ll指令看到:

在这里插入图片描述

上图中,第三项和第四项就分别代表拥有者所属组,即box-he box-he。说明这两个文件的拥有者和所属组都是box-he用户。

那么为什么这个文件没有写other呢?因为除了拥有者和所属组,其他用户的身份都是other

那么我们要如何对文件的拥有者和所属组进行修改呢?

chown
chown指令用于修改文件的拥有者,语法如下:

chown 新拥有者 文件名

该指令需要root权限才能执行,要么就在root身份下执行,要么就使用sudo进行指令提权

在此,我直接切换为root进行该操作,接下来我们尝试把test.txt的拥有者改成root

在这里插入图片描述

可以看到,test.txt文件的拥有者变成root了。

chgrp
chgrp指令用于修改文件的所属组,语法如下:

chgrp 新所属组 文件名

chown相同,该指令需要root权限才能执行

接下来我把test.txt的所属组也改成root

在这里插入图片描述

这下test.txt文件的所属组也变成root了。

那么我们知道了对于一个文件,不同的用户有不同的身份,那么每个身份又有怎样的权限呢?这就和文件的权限值相关了。


权限值

当我们用ll输出当前目录下的文件信息时,其实就可以看到文件的权限值了:
在这里插入图片描述
其中,每个文件前的第一项,就是该文件的权限值。比如test.txt的权限值为-rw-rw-r--testdir的权限值为drwxxrwxr-x
testdir为例,一个文件的权限值可以拆为:

第一个字符d:表示文件类型
第2,3,4个字符rwx:表示拥有者的权限
第5,6,7个字符rwx:表示所属组的权限
第8,9,10个字符r-x:表示other的权限

除了第一个字符表示文件的类型,常见的文件类型及标识符如下:

  • d:目录文件
  • -:普通文件
  • b:块设备文件
  • c:字符设备文件
  • p:管道文件
  • l:链接文件

那么我们的testdir第一个字符为d,说明该文件是个目录。

剩下的九个字符,每三个为一组,其中字符的含义为:

  • r:读取权限
  • w:写入权限
  • x:执行权限
  • -:没有该位置对应的权限

因此drwxxrwxr-x的意思就是,该文件的拥有者可以读,写,执行;该文件的所属组可以读,写,执行;该文件的other可以读,执行,但是不能写入。

比如以下文件test.txt的权限为rwx------,拥有者和所属组都是root,当前用户是box-he

在这里插入图片描述

可以看到,我们不能通过echo向文件写入,不能通过cat读取文件,也不能执行文件。

我们再看到以下情况:

在这里插入图片描述

现在test.txt的拥有者和所属组都是box-he,但是拥有者的权限是---,所属组的权限是rwx,那么box-he能不能对该文件操作呢?

在这里插入图片描述

可以看到,box-he不享有该文件的读写权限。可是box-he明明是该文件的所属组,虽然拥有者的权限是---,但是所属组的权限是rwx,为啥box-he用户无法享有该权限呢?

一个用户的权限只从左向右匹配一次,当一个用户被匹配为了拥有者,那么他就只享有拥有者的权利,而不享有所属组的权利

因此,box-he虽然是所属组,但是由于先匹配到了拥有者,最后就只有拥有者的权限了。


目录的权限

对于目录而言,其权限和普通文件还是有所区别的。

在这里插入图片描述

从上图中可见,不论是目录还是文件,都是用rwx来表示权限值的。但是目录的rwx的含义略有不同:

  • r:决定用户能否查看目录内容
  • w:决定用户能否在目录中创建,修改,删除文件
  • x:决定用户能不能进入目录

现在我们有以下目录文件testdir
在这里插入图片描述

testsdir的拥有者为root,所属组为box-he,但是box-he所在的所属组的权限为---。接下来我们尝试以box-he的身份来执行进入目录,查看目录的操作:

在这里插入图片描述

可以看到,两者都被拒绝了,接下来我们打开r权限与x权限:

在这里插入图片描述

现在我们就可以正常的进入以及查看目录了,但是我们现在还不能在目录里面删除与创建文件,这涉及到目录的w权限:

在这里插入图片描述
现在我们把testdir的权限改为rwxrwx---,这样box-he就可以在内部增删文件了:

在这里插入图片描述

我们再看看tetsdir内部都有啥文件:

在这里插入图片描述

testdir内部,有三个文件,这三个文件的拥有者都是root,权限都是rw-------,也就是说当前box-he对这些文件没有任何权限。但是别忘了,只要一个用户有目录的w权限,那么就可以删除目录里面的文件,我们看看box-he能不能把这三个文件删掉:

在这里插入图片描述

我们居然可以把一个完全没有任何权限的文件给删掉,甚至这个文件属于root

删除一个文件,与用户也没有这个文件的权限无关,只和这个用户有没有该目录的w权限有关


权限的修改

讲了这么久文件的权限,那么我们要如何修改一个文件的权限呢?

chmod指令

chmod指令用于修改文件的权限值。

语法:

chmod [选项] 权限 文件名

注意:只有文件的拥有者和root可以修改文件的权限

对于chmod指令,其通过+-=来进行修改,通过用户符号来表示对哪一个用户操作:

  • u:拥有者user
  • g:所属组group
  • o:其他用户other
  • a:所有用户all

比如以下语法:

chmod u+r test.txt

test.txtuser增加r权限

chmod o-w test.txt

test.txtother删除w权限

chmod g+rx test.txt

test.txtgroup增加rx权限

chmod a=rwx test.txt

test.txt所有用户的权限变成rwx

另外的,文件的权限值还支持八进制格式,比如rwxr-x---,可以把每一个权限值视为一个比特位,该位权限有就是1,没有就是0。因此该权限值二进制可以写为111101000,再转化为八进制就是750

chmod指令还支持八进制形式的修改

语法:

chmod [选项] 八进制值 文件名

比如有以下文件:

在这里插入图片描述

那么我们chmod 777 test1.txt,就是把test1.txt的权限值设置为777,二进制对应111111111,也就是rwxrwxrwx。看看效果:

在这里插入图片描述

对应的文件就是rwxrwxrwx了。


umask指令

讲解umask指令之前,我们看到一个问题,文件和目录的默认权限值是什么?

我创建一个文件和目录来试验一下:

在这里插入图片描述

可以看到,这里目录的默认权限值为rwxrwxr-x,而普通文件的默认权限值是rw-rw-r--

但是你的Linux的默认权限有可能与我不同,这是因为权限的默认设置是会受到权限掩码的影响的,每个人的权限掩码有可能不同。

首先,文件与目录是有起始权限的:

普通文件的起始权限是0666,也就是rw-rw-rw-
目录文件的起始权限是0777,也就是rwxrwxrwx

我们可以直接输入指令umask查看当前权限掩码:

在这里插入图片描述

我这台主机当前的权限掩码为0002,去掉第一位,后三位的二进制就是000 000 010。那么权限掩码是如何生效的呢?

算法如下:

 最终权限  =  起始权限 & (    ˜ umask)  \text { 最终权限 }=\text { 起始权限 \& ( \~ umask) }  最终权限 = 起始权限 & (  ˜umask) 

也就是先对权限掩码umask取反,然后再让起始权限与其按位与操作。

比如目录的起始权限为111111111,我的umask0002,也就是000000010~umask等于111111101,与起始权限111111111进行按位与得到111111101。因此我最后创建一个目录的默认权限为rwxrwxr-x

这个权限掩码也可以直接修改,chmod xxx就可以把权限掩码修改为xxx


粘滞位

现在来想一个问题,如果我们想要创建一个目录,让多个人在内部进行合作交流。互相可以翻阅文件,也可以在目录内部自由创建文件,应该怎么做?

先创建一个目录:

在这里插入图片描述

这个目录tmp就是后续大家相互交流的文件,现在我们希望所有的other都可以在内部创建文件,互相浏览文件,进行交流,那么我们就要开放该目录的w权限:

在这里插入图片描述

但是开放了w权限有一个问题,那就是大家不仅可以在目录内部自由创建文件,还可以自由删除文件!!

这就会导致,一个用户可以删除别人的文件,但是我们只希望互相之间可以查阅文件,以及自由创建文件。以我们目前学习的权限知识,没有办法处理这个问题。

Linux为此特别制定了一个粘滞位权限t,其用于替代x权限,t权限的规则如下:

  • 一个文件只能被root目录所有者文件所有者删除

我们可以直接通过chmod增加该权限:

在这里插入图片描述

那么对于这个tmp目录内部的文件,就只有root可以删除,文件所有者可以删除,目录所有者可以删除了。这样各个other之间,就不能互删文件了,但是由于目录的w权限开放,大家依然可以自由创建文件。


相关推荐

  1. linux权限

    2024-04-08 00:56:02       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-08 00:56:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-08 00:56:02       20 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-08 00:56:02       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-08 00:56:02       20 阅读

热门阅读

  1. 初识虚拟机:探索数字世界的神奇工具

    2024-04-08 00:56:02       15 阅读
  2. 设计模式:组合模式示例

    2024-04-08 00:56:02       14 阅读
  3. 【题解 | 01背包】目标和

    2024-04-08 00:56:02       12 阅读
  4. SSH免密登录 远程创建账户

    2024-04-08 00:56:02       13 阅读
  5. 前端开发之el-select 设置默认值后选项无法切换

    2024-04-08 00:56:02       61 阅读
  6. 违法解除劳动合同后【股票争议】——案例学习

    2024-04-08 00:56:02       21 阅读
  7. 第十五题:最大距离

    2024-04-08 00:56:02       42 阅读
  8. 【算法】求平方根 - 二分法/牛顿迭代

    2024-04-08 00:56:02       16 阅读