【Linux系统编程】粘滞位详解

文章目录

  • 1. 背景
  • 2. 准备
    • 问题引出
  • 3. 粘滞位
  • 4. 思考
    • 粘滞位的存在是否是必要的
    • 谁可以删除

上一篇文章我们学习了Linux权限相关的内容,这篇文章,我们再来学习一个知识点——粘滞位。

1. 背景

那为了让大家更容易理解粘滞位的概念,首先我们要来了解一点背景知识:

就是我们在使用Linux的时候呢,有时候就可能需要一些共享目录,即被所有普通用户共享,用来保存普通用户产生的临时数据。

那为什么可能会需要共享目录呢?我们来简单分析一下:

我们知道所有普通用户的家目录都是在home目录下的
【Linux系统编程】粘滞位详解_第1张图片
那这个home目录其实是属于root的。
那我们创建的所有普通用户,它们的家目录都是在home下面的
【Linux系统编程】粘滞位详解_第2张图片
那大家看,我目前登录的是yhq,这里的yhq就是我的家目录,我未来创建的所有文件都是在我的家目录里面的,而且只有我对我的家目录是有rwx权限的,其它的任何一个普通用户对我的家目录都是没有任何权限的。
那假设现在我这里有一份数据,是学生的考试成绩,那现在ymm这个用户也想来看一下这份数据。
那不好意思,ymm这个用户没有权限,因为她是other,根本无法进入我的目录,更别谈看我家目录里面的文件了。
但是未来呢,我们可能有这样的需求,就是让多个用户去交互它们的数据。
那因此,我们就可能需要一些共享目录,把需要共享的数据放在共享目录下,所有的用户就都可以查看了。
那在Linux中,这个共享目录一般是由root提供的,只要root把权限放开,那其他普通用户就可以以other的身份去访问这个目录了。

2. 准备

那接着我们来做一些准备工作:

【Linux系统编程】粘滞位详解_第3张图片
现在我进入到根目录下,我想在这里创建一个共享目录
【Linux系统编程】粘滞位详解_第4张图片
但我们发现创建不了,因为根目录是root的,我们是other,而且没有w权限,所以无法在根目录下再去创建目录。

创建不了怎么办呢?

那我们可以切换成root去创建,当然后面如果sudo能用的话我们可以直接用sudo
【Linux系统编程】粘滞位详解_第5张图片
此时我就创建好了一个公共目录public。
我们看到它的一个默认权限是755,当然这和root下的umask肯定是有关系的。

那既然要创建的是公共目录,我们可以把它所有的权限都放开

【Linux系统编程】粘滞位详解_第6张图片

那么此时所有人就都可以访问它:

我(yhq)也可以进入该目录去创建文件
【Linux系统编程】粘滞位详解_第7张图片
那我root也来创建几个文件
【Linux系统编程】粘滞位详解_第8张图片
当然其它普通用户也是可以的
【Linux系统编程】粘滞位详解_第9张图片
那此时我(ymm)来给我创建的文件里面输出一些内容
【Linux系统编程】粘滞位详解_第10张图片

那在这个共享目录里面,不同的用户也就可以实现数据的共享了:

比如我(yhq)这里有一个文件,现在ymm用户想看,那我就可以把该文件拷贝到public这个目录下,然后给other一个读的权限,那ymm就可以查看了。

问题引出

那我们来看这样一种场景

我现在是yhq
【Linux系统编程】粘滞位详解_第11张图片
那我先想看一下ymm的ymm1这个文件里面的内容,这当然是可以的,因为在这个文件在共享目录public里面,并且other有r读的权限
【Linux系统编程】粘滞位详解_第12张图片
那我想向ymm的文件里写内容可以吗?
【Linux系统编程】粘滞位详解_第13张图片
,不行,因为人家没有对other开放写的权限。
所以我们即使处在共享目录下,也还是会受到权限的约束,这也很正常,因为我和ymm都是普通用户。

那然后呢,假设有一天,我和ymm吵架了,ymm生气了,说:以后不让我看ymm1这个文件了,就把权限改成这样了
【Linux系统编程】粘滞位详解_第14张图片
现在只有她自己对该文件有rw权限,其它任何普通用户都没权限了。
所以我现在看也看不了了:
【Linux系统编程】粘滞位详解_第15张图片
那她这样做我很伤心,我也生气了,我就想,既然你不让我看,也不让我写。
那我想把你删掉可以吗?

【Linux系统编程】粘滞位详解_第16张图片
你不让我看,那你也别看了,我直接把文件删除掉。

那大家想一下,我为什么可以把ymm的文件删除掉?

,这是不是上一篇文章讲到的内容啊,我们学了目录的权限,只要我对一个目录有写权限,我就可以在这个目录里面创建和删除文件。
所以,我对public这个目录有写权限,而你的文件放在这个目录下。
因此即使我看不了也写不了你的文件,但是我可以把它删除掉。

所以,在共享目录里面,文件被所有用户共享的时候,会受到权限约束,但是拦不住别人删你的文件!!!

那大家想,这样合理吗?
显然是不合理的,那为了解决这个不科学的问题,Linux就引入了粘滞位的概念。(因此我们也应该知道,粘滞位只能给目录添加

3. 粘滞位

那为了解决上述问题,就引入了粘滞位的概念,通过给目录添加粘滞位就可以就解决这个问题。

那给哪个目录添加呢?
当然是给共享目录添加啊!

那具体怎么做呢?
很简单:chmod +t 目录名

演示一下:

添加之前看好了是这样的:
【Linux系统编程】粘滞位详解_第17张图片
那我们现在就来给public这个目录添加粘滞位。
当然添加粘滞位也需要root,或者使用sudo:

【Linux系统编程】粘滞位详解_第18张图片
添加好了,大家看出来哪里变了吗?
最后一位由x变成了t,而t就表示该目录被添加上了粘滞位。

那这样就可以解决上述的问题吗?我们还能在共享目录里面胡乱删除别人的文件吗?

来试一下:
【Linux系统编程】粘滞位详解_第19张图片
此时我又变成了yhq,现在我又想删ymm的文件,还可以吗?
【Linux系统编程】粘滞位详解_第20张图片
,现在就不可以删除别人的文件了。

这就是粘滞位的作用。

4. 思考

那大家思考一个问题,上面没有添加粘滞位的时候,为什么拦不住可以删除别人的文件?

其实原因我们上面已经提到了,因为我对public这个目录有w权限,所以我就可以在里面创建和删除文件。

粘滞位的存在是否是必要的

那这样的话,还需要什么粘滞位啊,我直接把public的对other的w权限去掉,不就可以阻止有些用户删除别人的文件了吗?

这样确实可以,但是
你把w权限去掉,也阻止了所有普通用户在该目录下创建文件的权限。
而这个目录作为共享目录,本身就是大家用来去共享自己创建的文件里面的数据的。
那你现在连创建文件都不可以了。
那这个共享目录还有什么作用!!!

所以,共享目录对于other,必须有w权限,因此,解决这个问题,只能用粘滞位。

只有加上了w权限,所有的用户才可以在里面创建文件,但是这样有会出现可以随意删除别人文件的现象。
因此呢,Linux就引入了粘滞位权限去解决这个问题。

谁可以删除

那我们设置了粘滞位之后呢,就可以阻止在共享目录中的一些普通用户去删除其它用户的文件。那这样普通用户删不了,谁可以删呢?

当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由

  1. 超级管理员(root)删除
  2. 该目录的所有者(一般就是root)删除
  3. 该文件的所有者删除

【Linux系统编程】粘滞位详解_第21张图片

你可能感兴趣的:(Linux,系统编程,linux,java,服务器)