Linux Sticky Bit 概念的解释

举报
Tiamo_T 发表于 2022/07/21 17:49:49 2022/07/21
【摘要】 在本文中,我们将通过一些示例讨论如何设置和取消设置粘滞位。

设想一个场景,您创建了一个可供 Linux 系统的所有用户用于创建文件的 Linux 目录。用户可以根据自己的方便在此目录中创建、删除或重命名文件。对于所有认为为什么要创建这样一个目录的人?例如,Linux 系统中存在 /tmp 目录,不同的 Linux 用户可以使用该目录创建临时文件。

现在,如果用户意外或故意删除(或重命名)该目录中其他用户创建的文件怎么办?

好吧,为了避免这类问题,使用了粘位的概念。

粘性位是在文件或目录上设置的权限位,仅允许文件/目录的所有者或 root 用户删除或重命名文件。没有其他用户被授予删除其他用户创建的文件的权限。

粘滞位的历史

在进一步解释粘性位之前,让我们讨论粘性位的历史,因为这些信息值得讨论。

粘性位并不是一个新概念。事实上,它于 1974 年首次在 Unix 操作系统中引入。当时粘位的目的不同。引入它是为了最小化每次执行程序时引入的时间延迟。

当一个程序被执行时,在用户真正开始使用它之前,需要一些时间将程序加载到内存中。如果一个程序(例如编辑器)被用户频繁使用,那么启动时间延迟在当时是一种开销。

为了改善这个时间延迟,引入了粘性位。操作系统检查是否可执行文件上的粘滞位为 ON,则可执行文件的文本段保留在交换空间中。当程序再次运行时,这使得将可执行文件加载回 RAM 变得很容易,从而最大限度地减少了时间延迟。


尽管这种方法在最小化启动时间延迟方面被证明是成功的,但是由于这种操作而出现了一个主要问题。问题是,如果将某种补丁作为错误修复或新功能应用于可执行文件,则需要执行以下步骤:

  • 首先从可执行文件中删除粘性位
  • 现在,运行可执行文件并退出它,以便刷新交换中的现有文本段
  • 现在,再次在可执行文件上设置粘性位并重新运行可执行文件,以便将新的文本段存储在交换内存中

上述步骤是必需的,以便程序反映添加到可执行文件中的新功能或错误修复。

所以这是主要问题之一。此外,随着技术的发展,快速内存访问技术也在不断发展,从而淘汰了为此目的对粘着位的要求。

粘滞位示例

在本文中,我们将通过一些示例讨论如何设置和取消设置粘滞位。

一个基本的例子

创建一个目录并为所有用户提供对其的读写执行访问权限:

# mkdir allAccess

# chmod 777 allAccess/

# ls -ld allAccess/
drwxrwxrwx 2 himanshu himanshu 4096 Oct 24 15:43 allAccess/

因此,我们看到创建了一个名为“allAccess”的目录,并通过chmod命令将对该目录的读写执行权限授予所有用户。

现在,在此目录中创建多个文件(使用不同的用户),以便所有用户都具有对它们的读写执行访问权限。

例如:

# ls -l allAccess/
total 0
-rwxrwxrwx 1 himanshu himanshu 0 Oct 24 15:48 user1
-rwxrwxrwx 1 guest    guest    0 Oct 24 16:11 user_file_0
-rwxrwxrwx 1 guest-2  guest-2  0 Oct 24 16:15 user_file_1

文件 user_file_0 和 user_file_1 由不同的用户创建,但对所有用户都具有读写执行权限。这意味着用户“guest”可以删除或重命名用户“guest-2”创建的文件。

为了避免这种情况,可以在目录 allAccess 上设置粘滞位。

现在,使用 chmod 命令的 +t 标志打开目录上的粘性位。

# chmod +t allAccess/

# ls -ld allAccess/
drwxrwxrwt 2 himanshu himanshu 4096 Oct 24 16:19 allAccess/

可以看出,在目录的权限位中引入了权限位“t”。

现在,如果用户 'guest' 尝试重命名文件 'user_file_1',会发生以下情况:

$ mv /home/himanshu/allAccess/user_file_1 /home/himanshu/allAccess/user_file_0
mv: cannot move `/home/himanshu/allAccess/user_file_1' to `/home/himanshu/allAccess/user_file_0': Operation not permitted

所以我们看到该操作是不允许的。

使用 -t 选项删除粘滞位

可以通过 chmod 命令的 -t 选项从目录权限中删除粘滞位。

这是一个例子:

# chmod -t allAccess/

# ls -ld allAccess/
drwxrwxrwx 2 himanshu himanshu 4096 Oct 24 16:19 allAccess/

所以我们看到权限位“t”已从目录中删除。

不同的操作系统对粘滞位的行为有所不同。例如,Linux 仅在用户尝试重命名文件时查找粘滞位。如果文件被删除,它不会检查粘滞位。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。