Linux Sticky Bit 概念的解释
设想一个场景,您创建了一个可供 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 仅在用户尝试重命名文件时查找粘滞位。如果文件被删除,它不会检查粘滞位。
- 点赞
- 收藏
- 关注作者
评论(0)