
🔥个人主页:胡萝卜3.0****
📖个人专栏:************************************************************************************************************************************************************************************************************************************************************《C语言》、《数据结构》 、《C++干货分享》、LeetCode&牛客代码强化刷题****************************************************************************************************************************************************************************************************************************************************************
⭐️人生格言:不试试怎么知道自己行不行
🎥胡萝卜3.0🌸的简介:


目录
[1.1 作为一个普通用户,进入一个目录需要什么权限?](#1.1 作为一个普通用户,进入一个目录需要什么权限?)
[1.2 为什么新建文件的时候,新建的文件的权限就是我们所看到权限?](#1.2 为什么新建文件的时候,新建的文件的权限就是我们所看到权限?)
[1.2.1 普通文件](#1.2.1 普通文件)
[1.2.2 目录](#1.2.2 目录)
[1.3 root新建的文件,普通用户不能读,不能写,不能执行,那普通用户还能删吗?](#1.3 root新建的文件,普通用户不能读,不能写,不能执行,那普通用户还能删吗?)
[2.1 关于文件删除的话题](#2.1 关于文件删除的话题)
[2.2 Linux文件共享的话题](#2.2 Linux文件共享的话题)
一、权限三问:深入理解Linux权限机制的关键问题
注意:以下所说的文件包括:普通文件和目录!!!
1.1 作为一个普通用户,进入一个目录需要什么权限?
- 进入一个目录需要 x 权限,x 权限决定是否可以进入一个目录
- r 权限决定了是否可以查看目录里面的文件信息
- w 权限决定了能不能在指定目录里面新建/删除文件
我们在xshell中演示一下:
bash
[carrot@VM-0-16-centos ~]$ ll
total 4
drwxrwxr-x 2 carrot carrot 4096 Dec 24 14:06 dir1
[carrot@VM-0-16-centos ~]$ ll dir1
total 8
-rw-rw-r-- 1 carrot carrot 6 Dec 24 14:06 hello.txt
-rw-rw-r-- 1 carrot carrot 10 Dec 24 14:06 test.txt
我用普通用户创建了一个dir1目录,并且在dir1目录中创建了两个文件:hello.txt和test.txt
现在我(carrot)作为该目录dir1的拥有者,对于dir1目录有rwx权限------
- 删除拥有者的 r 权限
bash
[carrot@VM-0-16-centos ~]$ chmod u-r dir1
[carrot@VM-0-16-centos ~]$ ll
total 4
d-wxrwxr-x 2 carrot carrot 4096 Dec 24 14:06 dir1
# 将拥有者的 r 权限删除之后,可以正常进入
[carrot@VM-0-16-centos ~]$ cd dir1
[carrot@VM-0-16-centos dir1]$ pwd
/home/carrot/dir1
我们将拥有者的 r 权限删除之后,可以正常进入dir1目录,说明权限 r 不是决定作为一个普通用户是否可以进入目录
而是决定一个普通用户是否查看目录中的文件信息------

- 删除拥有者的 w 权限
bash
[carrot@VM-0-16-centos ~]$ chmod u+r,u-w dir1
[carrot@VM-0-16-centos ~]$ ll
total 4
dr-xrwxr-x 2 carrot carrot 4096 Dec 24 14:06 dir1
[carrot@VM-0-16-centos ~]$ cd dir1
[carrot@VM-0-16-centos dir1]$ pwd
/home/carrot/dir1
[carrot@VM-0-16-centos dir1]$ ll
total 8
-rw-rw-r-- 1 carrot carrot 6 Dec 24 14:06 hello.txt
-rw-rw-r-- 1 carrot carrot 10 Dec 24 14:06 test.txt
我们加上carrot作为拥有者的 r 权限,并删除 w 权限,发现可以进入dir1目录,并且可以查看文件的信息,说明 w 权限 不是决定作为一个普通用户是否可以进入目录
而是决定一个用户是否在dir1目录中新建文件和删除文件------

- 删除拥有者的 x 权限
bash
[carrot@VM-0-16-centos ~]$ chmod u+w,u-x dir1
[carrot@VM-0-16-centos ~]$ ll
total 4
drw-rwxr-x 2 carrot carrot 4096 Dec 24 14:06 dir1
ok,我们加上dir1目录拥有者的 w权限,删除 x权限------
此时再进入di1目录就进不去了------

这就说明 x权限决定一个用户是否可以进入目录!!!
ok,那接下来我们再来看一下:w 权限决定了能不能在指定目录里面新建/删除文件
此时我在拥有者是carrot(普通用户),所属组是carrot(普通用户)的dir1目录中,用root权限创建一个拥有者是root,所属组是root的普通文件------

此时删除root.txt文件对于other的全部权限------

我现在作为一个普通用户(carrot),对于该root.txt文件不能读、不能写、不能执行,那我直接删除这个文件------

我作为一个普通用户竟然删掉了这个由root创建的,拥有者是root,所属组是root,对于other没有rwx权限的root.txt文件,这合理吗?
ok,这是合理的,root.txt文件在dir1目录中,我对于dir1目录有w权限,我能删除dir1目录中的所有文件,虽然root.txt是root创建的,但是你是在我的目录中创建的,只要对于目录我有 w权限,我就可以删除该目录中的任何文件!!!
总结:
- 目录中的文件能否被删除,由所在的目录的 w权限决定!!!
1.2 为什么新建文件的时候,新建的文件的权限就是我们所看到权限?

也就是:为什么新建文件或者目录的时候,一新建出来就是上面我们所看见的权限?
1.2.1 普通文件
ok,我们先来看普通文件------

rw-r--r-- 就是 644,为什么是664呢?不应该是666或者777吗?

但这也不是666,而是644,这是为什么?
其实在Linux系统中,会存在一个叫做:权限掩码
我们使用:umask,就可以查看当前系统中的权限掩码------
bash
[root@VM-0-16-centos carrot]# umask
0022

那这个权限掩码和普通文件的起始权限不从666开始有什么关系呢?

什么意思呢?
权限掩码的意思就是:你最终形成的文件权限不能以起始权限为主,你得在创建文件的时候,拿着你的起始权限在权限掩码中找,凡事在权限掩码中出现的权限就不能在最终的文件权限中出现
比如:如果权限掩码中的other位 w 权限为1,那么我们就要在起始权限中将other位的 w 权限去掉
换成公式就是:

我们以上面的为例,来看一下这个公式------

**权限掩码的含义是:**在我们创建一个普通文件,起始文件权限从666开始,但是有时,我们想屏蔽某些对应的权限,我们就可以通过设置权限掩码
那为什么要有权限掩码呢?
- 如果没有权限掩码,普通文件的权限都是从666开始,某些个性化需求就无法满足;
- 如果有权限掩码,我们就可以灵活调整创建文件的时候的最终权限
就比如说:我想创建一堆普通文件,该文件只能对于拥有者有rwx权限,其余没有任何权限
这该怎么做?
bash
[root@VM-0-16-centos carrot]# umask 066
umask 066 就可以将权限掩码改为066!!!可以通过修改umask ,从而修改文件的最终权限

1.2.2 目录

为什么新建的目录的起始权限是我所看到的?
ok,先来解释一下:为什么给目录带上 x 权限?
对于一个目录而言,目录具有 x权限是刚需,因为任何一个目录新建的时候,默认就要被进入,所以必须带上 x权限

原因和普通文件一样,这里就不过于赘述!!!
- 细节一:对于不同的用户,umask可能不一样
- 细节二:不用担心umask被修改的问题,退出登录,重新登录,umask会恢复默认
- 细节三:如何创建一批普通文件?只保留拥有者的权限

1.3 root新建的文件,普通用户不能读,不能写,不能执行,那普通用户还能删吗?
如果root新建的文件是普通用户创建的目录中,并且普通用户不能读,不能写,不能执行,普通用户可以将root新建的文件删除掉
原因:
- 目录中的文件能否被删除,不由文件自己决定,而是由文件所在的目录的w权限决定
后面会进行再次解释!!!
二、粘滞位
要真正理解粘滞位,需要理解2个问题:
- 关于文件删除的话题
- Linux文件共享的话题
我们一一来看------
2.1 关于文件删除的话题
我作为一个普通用户(carrot),新创建一个(拥有者是carrot,所属组是carrot)目录

然后我以root的身份在118目录中创建一个root.txt,并且不让other读,写,执行------

ok,现在我carrot不能对root.txt进行读,写以及执行操作,那我(carrot)删掉这个root.txt文件:

ok,这里的现象是:一个root在我(carrot)普通用户的118目录下创建一个文件root.txt,不让我读,写,执行,但是我竟然删掉了这个root创建的文件!!!
- 为什么普通用户(carrot)可以把root创建的文件删除掉?
删除文件不是有文件本身决定,而是由文件所在的目录的w权限决定!!!
- carrot这个普通用户,凭什么删掉root创建的文件?
被删除的文件的所在目录是carrot的,118这个目录的拥有者和所属组都是carrot(普通用户),并且118目录对于其拥有者有w权限,有w权限,普通用户就可以删除其目录中的任一个文件。
root作为管理员不能在普通人的家里随便新建一个东西,roo敢建,普通用户就敢删,这是应该的
总结:
-
删除文件,不是有目标文件决定,而是有文件所在的目录的w权限决定,一个普通用户对于该目录有w权限,普通用户就可以删除该目录中的任意文件(即使是root创建的)
-
那另一个普通用户可以在我(普通用户)的目录下新建文件吗?
另一个普通用户,没有资格在我的目录下新建文件,这是因为我的目录权限中默认是没有给other w权限的,other的w权限被umask去掉了
这就在一定程度上拦住了别人去我的目录下新建文件!!!
2.2 Linux文件共享的话题
在有时候,两个终端下面可能会共享文件
但是一个用户不可能跑到另一个用户的目录下新建文件,因为对于other没有w权限
除了root,其余普通用户在我的家目录中新建文件是不可能的------
那这就说明了,共享文件就绝对不能在任意一个用户的家目录中!!!共享文件一般在非用户家目录中------根目录下!!!

ok,那接下来我们来演示一下------
- 首先在根目录下创建一个共享文件夹
bash
[carrot@VM-0-16-centos ~]$ cd /
[carrot@VM-0-16-centos /]$ pwd
/
[carrot@VM-0-16-centos /]$ su
Password:
[root@VM-0-16-centos /]# mkdir shared_dir
[root@VM-0-16-centos /]# chmod o+w shared_dir/

- 然后我们使用carrot1普通账号在/shared_dir目录中新建一个共享文件:

然后carrot普通用户就可以进入/shared_dir目录中,然后查看share.txt文件:

此时又来一个用户:carrot2,不让carrot2读这个文件,写这个文件,执行这个文件------

那我carrto2删掉这个共享文件------

😯,我(carrot2)竟然把这个拥有者不是我carrot2,所属组不是我carrot2的共享文件删了!
这合理吗?似乎有点不合理
那我carrot2为什么可以删掉这个共享文件?

因为文件的删除不是由目标文件决定的,而是有目标文件所在的目录的w权限决定的。
该目录对于other有w权限,other可以删除该目录中的任意文件,carrot2就是other,所以carrot2可以删
那我现在不想让carrot2可以删除这个文件,我可不可以将目录对于other的w权限去掉?
- 不可以,如果去掉,carrot1或者carrot就不能在该共享文件夹下面新建文件了!!!
此时,我们就必须引入新的权限特征:给目录设置粘滞位!!!

设置粘滞位之后,carrot1在共享文件夹中新建一个共享文件,carrot2就删不掉了!!!

共享文件的拥有者是carrtto1,文件只能carrot1自己来删,这就是粘滞位的!!!
当⼀个目录被设置为"粘滞位"(用 chmod +t ),则该目录下的文件只能由
- 超级管理员删除
- 该⽂件的所有者删除
但是但是,其实这个共享文件是不需要我们自己去做的,在Linux的根目录中本来就存在一个目录------tmp(临时目录):

tmp目录默认就有t,任何人可以在tmp目录中新建文件,并且自己建的只能自己来删或者root删,所以以后两个人的共享文件就可以在tmp中创建!!!
注意:上面演示共享文件的过程的目的是为了让大家更清楚的认识这个过程!!!
结尾
希望对学习Linux相关内容的uu有所帮助,不要忘记给博主"一键三连"哦!

