五.常见的权限三个问题
一.目录文件的权限知识
为了方便讲解,我们把mycmd.mp4和test.txt文件都删除了
只剩下了一个mydir目录文件
现在我身为mydir这个目录的拥有者,我可以进入mydir
查看mydir中的文件
在mydir中创建文件
在mydir中删除文件
下面我们分别去掉对应权限看一下这一连串操作有哪些会受到影响
不过再此之前,我们在重新创建test.txt文件,并向里面写入一些数据
1.r权限
我连ls命令都执行不了,也就是说我根本连查看这个目录当中有什么什么文件的权限都没有
那么我可以写文件吗?
创建一个文件可以,查看一个文件的内容也可以,甚至我也可以删除一个文件
但是我连这个目录当中有什么类型的文件都无法知道
对于目录文件而言
r:决定了是否可以进行对文件属性信息进行查看的权利(ll/ls -l)
2.w权限
我们无法新建一个文件,删除一个文件
但是可以查看一个文件的内容,修改一个文件的内容
对于目录文件而言
w:决定了是否可以在目录下进行新建和删除文件
3.x权限
我无法进入mydir,也无法查看里面的内容,也无法对里面的文件进行任何修改,无法新建和删除文件
对于目录文件而言:
x:决定是否可以进入该目录
二.文件的默认权限
我们新建一个普通文件和一个目录文件
然后ll查看他们的属性
发现我们创建的普通文件:默认的权限不是777,而是664
我们创建的目录文件:默认的权限不是777,而是775
为什么呢?
1.权限角度来理解
1.普通文件
首先,我们知道如果一个普通文件有x权限,那么这个文件就有可能是可执行文件
而可执行文件只是这普通文件中的一种而已,占比并不大
所以Linux中的文件刚刚创建的时候,默认的权限应该是不带有x的
也就是说默认的起始权限应该是666
那么为什么是664呢?
我们又注意到,666和664的区别是:
666:对于other来说是rw-
664:对于other来说是r–
也就是说默认权限将other的w权限取消,这也合情合理,因为你other本来就不应该拥有能够修改我这个文件的权限
2.目录文件
首先,对于一个目录文件来说,进入目录,查看目录内容,查看对应的文件内容,新建/删除/修改某个文件都是有必要的,因此起始权限应该是777
那么为什么要是775呢?
777:other:rwx
775:other:r-x
也就是说默认权限将other的w权限取消,这也合情合理,因为你other本来就没有不应该拥有能够在我的目录中新建,修改,删除文件的权限
2.通过(umask:权限掩码)的具体实现
那么Linux是怎么实现的呢?
是通过umask掩码来实现的
这个umask的作用是:定制一个文件被创建的时候的默认权限
我们可以通过umask命令来看一下对应的umask掩码
而且umask是可以修改的
比方说我想把它改成0003
然后我再去创建一个普通文件,一个目录文件
发现:普通文件:664,目录文件:774
那么它是怎么实现的呢?
1.实现的理解
然后我们可能会想:这还不简单,
直接相减不就ok了吗?
或者:
异或一下不就ok了吗?
1.异或的错误
首先我们先证明一下为什么异或不对
我们提到过umask等于0003时,
普通文件:664,目录文件:774
那么我们用异或和普通文件为例来推导一下
看能否得出664
异或得出665来,所以异或失败
2.减法的错误
还是以上面那个为例
减法出来的是663,不对
2.实现方法
其实,实现方法是:
这么神奇,其实原理是这样的
只有当文件权限为1并且umask对应位置的数据也为1时,才会将文件权限的那个1改为0
umask先按位取反后,
就只需要让文件权限为1并且umask对应位置的数据为0时,将那个1改为0,如果文件的权限为0,依然保持是0
也就是说只有当文件权限为1并且umask对应位置的数据也是1的时候,该文件的权限才会保持是1,否则就是0
这不就是按位与(&)运算吗
三.粘滞位
1.一个现象
比方说有一天,root想要捉弄一下zs,但是"玩笑"开的太大了
什么玩笑呢?
root在zs的目录中创建了一大堆文件,
而且创建文件之后会还把这些文件的权限置为了000
关于这个shell脚本命令
我之前在Linux常见指令2中提到过
i=0; while [ $i -le 100 ]; do echo "hello $i";touch $i.txt; let i++;done • 1
i=0; while [ $i -le 100 ];do chmod a-rwx $i.txt; let i++;done
权限是000,所以zs无法查看,修改这些文件,
但是root不受权限的约束,所以root可以随意操作这些文件
然后zs的工作环境非常糟糕,zs找了root很多次,root每次都是嘴上道歉,说一定会删了那些文件的,但是root没有一次真正去删过
后来zs受不了了,直接rm 全删了
可是那些文件zs没有任何权限啊,zs是怎么做到的呢?
因为这是zs的家目录,这个目录是zs的,zs作为这个目录的拥有者
拥有w权限,因此即使你root在我zs的目录下面捣乱,你建的文件,你把文件的权限全都关了,zs没法看,没法修改,但是zs能删除
也就是说:
一个文件能否被删除,并不取决于文件本身,而是取决于文件所处的目录的拥有者是否具有w权限!
2.那么zs该不该删呢?
而且我们系统的家目录本来就只允许这个家的主人(对应家目录的创建者)进入,所以一般情况下是不会出现我wzs在你zs的目录中创建文件的.所以两个普通用户之间基本是不会出现这种情况的
3.粘滞位的引出
我wzs没法进入你zs的目录,你zs也没法进入我wzs的目录,可是如果我们现在有一个需求:
如果我们想要在一个特定的目录下面来实现文件的共享呢?
root创建了一个tmp目录,并且为了实现让多个用户之间可以数据共享,root将other的rwx权限全部放开
这里我们发现other的x权限被改为了t,这是为什么?
这个t就是粘滞位,我们为了凸显出粘滞位的作用
所以先把other的t这个权限去掉
然后我们让wzs和zs在tmp目录下共享文件
这里wzs创建了一个文件test.txt
往里面写了hello Linux
zs成功读取了test.txt文件
成功实现了wzs和zs共享文件的需求
但是呢,假设有一天,wzs和zs闹掰了
wzs把zs的权限关了,也就是把other的权限关了
zs没法读,没法写,zs一气之下把test.txt删了
在这里zs不该删的,就算zs真的想要删,也不应该让zs有这个权限去删除
但是为什么zs可是删除呢?
因为tmp这个目录对于other来说rwx的权限都放开了
zs和wzs都是other,都有w权限,因此都可以删除彼此的文件
Linux系统必然不能允许这种行为成功执行
因此引入了粘滞位这一解决方案
4.粘滞位的作用
下面我们把other的t权限加上
我们再去重复一下刚才的操作
这个时候zs就删不了我wzs的文件了
那么粘滞位的作用是什么呢?
粘滞位:就是给目录中的other设置一个权限位,具有x的意义
同时也进一步对目录权限进行特殊限定:
该目录里面的文件,只有root和文件的拥有者才有权利进行删除
其他人一概不允许!
以上就是:Linux中的shell外壳与权限(包含目录文件的权限,粘滞位的来龙去脉) 的全部内容,
希望能对大家有所帮助!