上一篇文章我们学习了Linux权限相关的内容,这篇文章,我们再来学习一个知识点——粘滞位。
1. 背景
那为了让大家更容易理解粘滞位的概念,首先我们要来了解一点背景知识:
就是我们在使用Linux的时候呢,有时候就可能需要一些共享目录,即被所有普通用户共享,用来保存普通用户产生的临时数据。
那为什么可能会需要共享目录呢?我们来简单分析一下:
我们知道所有普通用户的家目录都是在home目录下的
那这个home目录其实是属于root的。 那我们创建的所有普通用户,它们的家目录都是在home下面的
那大家看,我目前登录的是yhq,这里的yhq就是我的家目录,我未来创建的所有文件都是在我的家目录里面的,而且只有我对我的家目录是有rwx权限的,其它的任何一个普通用户对我的家目录都是没有任何权限的。 那假设现在我这里有一份数据,是学生的考试成绩,那现在ymm这个用户也想来看一下这份数据。 那不好意思,ymm这个用户没有权限,因为她是other,根本无法进入我的目录,更别谈看我家目录里面的文件了。 但是未来呢,我们可能有这样的需求,就是让多个用户去交互它们的数据。 那因此,我们就可能需要一些共享目录,把需要共享的数据放在共享目录下,所有的用户就都可以查看了。那在Linux中,这个共享目录一般是由root提供的,只要root把权限放开,那其他普通用户就可以以other的身份去访问这个目录了。
2. 准备
那接着我们来做一些准备工作:
现在我进入到根目录下,我想在这里创建一个共享目录
但我们发现创建不了,因为根目录是root的,我们是other,而且没有w权限,所以无法在根目录下再去创建目录。
创建不了怎么办呢?
那我们可以切换成root去创建,当然后面如果sudo能用的话我们可以直接用sudo
此时我就创建好了一个公共目录public。 我们看到它的一个默认权限是755,当然这和root下的umask肯定是有关系的。
那既然要创建的是公共目录,我们可以把它所有的权限都放开
那么此时所有人就都可以访问它:
我(yhq)也可以进入该目录去创建文件
那我root也来创建几个文件
当然其它普通用户也是可以的
那此时我(ymm)来给我创建的文件里面输出一些内容
那在这个共享目录里面,不同的用户也就可以实现数据的共享了:
比如我(yhq)这里有一个文件,现在ymm用户想看,那我就可以把该文件拷贝到public这个目录下,然后给other一个读的权限,那ymm就可以查看了。
问题引出
那我们来看这样一种场景:
我现在是yhq
那我先想看一下ymm的ymm1这个文件里面的内容,这当然是可以的,因为在这个文件在共享目录public里面,并且other有r读的权限
那我想向ymm的文件里写内容可以吗?
🆗,不行,因为人家没有对other开放写的权限。 所以我们即使处在共享目录下,也还是会受到权限的约束,这也很正常,因为我和ymm都是普通用户。 那然后呢,假设有一天,我和ymm吵架了,ymm生气了,说:以后不让我看ymm1这个文件了,就把权限改成这样了
现在只有她自己对该文件有rw权限,其它任何普通用户都没权限了。 所以我现在看也看不了了:
那她这样做我很伤心,我也生气了,我就想,既然你不让我看,也不让我写。 那我想把你删掉可以吗?
你不让我看,那你也别看了,我直接把文件删除掉。
那大家想一下,我为什么可以把ymm的文件删除掉?
🆗,这是不是上一篇文章讲到的内容啊,我们学了目录的权限,只要我对一个目录有写权限,我就可以在这个目录里面创建和删除文件。 所以,我对public这个目录有写权限,而你的文件放在这个目录下。 因此即使我看不了也写不了你的文件,但是我可以把它删除掉。
所以,在共享目录里面,文件被所有用户共享的时候,会受到权限约束,但是拦不住别人删你的文件!!!
那大家想,这样合理吗? 显然是不合理的,那为了解决这个不科学的问题,Linux就引入了粘滞位的概念。(因此我们也应该知道,粘滞位只能给目录添加)
3. 粘滞位
那为了解决上述问题,就引入了粘滞位的概念,通过给目录添加粘滞位就可以就解决这个问题。
那给哪个目录添加呢? 当然是给共享目录添加啊!
那具体怎么做呢? 很简单:chmod +t 目录名
演示一下:
添加之前看好了是这样的:
那我们现在就来给public这个目录添加粘滞位。 当然添加粘滞位也需要root,或者使用sudo:
添加好了,大家看出来哪里变了吗? 最后一位由x
变成了t
,而t就表示该目录被添加上了粘滞位。
那这样就可以解决上述的问题吗?我们还能在共享目录里面胡乱删除别人的文件吗?
来试一下:
此时我又变成了yhq,现在我又想删ymm的文件,还可以吗?
🆗,现在就不可以删除别人的文件了。
这就是粘滞位的作用。
4. 思考
那大家思考一个问题,上面没有添加粘滞位的时候,为什么拦不住可以删除别人的文件?
其实原因我们上面已经提到了,因为我对public这个目录有w权限,所以我就可以在里面创建和删除文件。
粘滞位的存在是否是必要的
那这样的话,还需要什么粘滞位啊,我直接把public的对other的w权限去掉,不就可以阻止有些用户删除别人的文件了吗?
这样确实可以,但是 你把w权限去掉,也阻止了所有普通用户在该目录下创建文件的权限。 而这个目录作为共享目录,本身就是大家用来去共享自己创建的文件里面的数据的。 那你现在连创建文件都不可以了。 那这个共享目录还有什么作用!!!
所以,共享目录对于other,必须有w权限,因此,解决这个问题,只能用粘滞位。
只有加上了w权限,所有的用户才可以在里面创建文件,但是这样有会出现可以随意删除别人文件的现象。 因此呢,Linux就引入了粘滞位权限去解决这个问题。
谁可以删除
那我们设置了粘滞位之后呢,就可以阻止在共享目录中的一些普通用户去删除其它用户的文件。那这样普通用户删不了,谁可以删呢?
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
- 超级管理员(root)删除
- 该目录的所有者(一般就是root)删除
- 该文件的所有者删除