Linux shell Sticky Bit 用法和示例
在我们讨论什么是粘性位之前,让我们首先解释一下为什么我们需要它。例如,我们在文件系统上的某个位置有一个目录 /var/share
,该目录对所有者、组和任何权限组具有完全访问权限,因此所有权限位都设置为“on” drwxrwxrwx:
# ls -ld /var/share/
drwxrwxrwx. 2 root root 4096 Mar 5 11:02 /var/share/
从上面我们可以看出,任何用户都对/var/share
目录具有读、写和执行的权限。接下来,在我们的场景中,我们有两个名为 user1
和 user2
的用户。由于现在每个人都可以访问 /var/share
目录,因此我们的 user1
可以导航到该目录并简单地创建任意文件:
user1@localhost ~]$ cd /var/share/
[user1@localhost share]$ touch file1
[user1@localhost share]$ ls -l file1
-rw-rw-r--. 1 user1 user1 0 Mar 5 11:08 file1
[user1@localhost share]$
file1
是使用用户的 umask
值设置的权限位创建的,并且用户和组所有权设置为其创建者,即 user1
。到目前为止,我们没有遇到任何问题,一切都按预期完美运行。随后,我们的 user2
导航到 /var/share
目录,并决定将 file1
重命名或删除为 file2
:
[user2@localhost share]$ cd /var/share/
[user2@localhost share]$ ls -l
total 0
-rw-rw-r--. 1 user1 user1 0 Mar 5 11:20 file1
[user2@localhost share]$ mv file1 file2
[user2@localhost share]$ ls -l
total 0
-rw-rw-r--. 1 user1 user1 0 Mar 5 11:20 file2
[user2@localhost share]$ rm file2
rm: remove write-protected regular empty file ‘file2’? y
[user2@localhost share]$ ls
[user2@localhost share]$
上面示例中发生的情况是,我们的 user2
导航到 /var/share
目录,列出了所有文件并找到了 file1
。通过使用mv
命令,用户将file1
重命名为file2
。文件已重命名,但文件的所有者和组未更改。之后,user2
只是决定使用 rm
命令删除该文件。
在这个阶段,我们需要某种机制来防止不拥有该目录或目录中实际文件的用户重命名或删除其他用户的文件。这种机制称为“粘性位”。 Sticky bit只允许root、目录所有者和文件所有者重命名和删除文件。使用 chmod 命令在目录上设置粘滞位:
[root@localhost ~]# chmod +t /var/share/
[root@localhost ~]# ls -ld /var/share/
drwxrwxrwt. 2 root root 4096 Mar 5 11:21 /var/share/
所有用户的最后一个可执行权限位现在设置为t
,这意味着粘滞位现已到位,只有根用户、文件或目录所有者可以重命名和删除文件。让我们复制上面的场景,让 user1
创建一个新的 file1
文件:
[user1@localhost share]$ ls
[user1@localhost share]$ touch file1
[user1@localhost share]$ ls -l
total 0
-rw-rw-r--. 1 user1 user1 0 Mar 5 11:34 file1
[user1@localhost share]$
file1
现已创建,由于粘性位现已到位,user2
现在将被阻止重命名或删除不属于他/她的文件:
[user2@localhost share]$ ls -l
total 0
-rw-rw-r--. 1 user1 user1 0 Mar 5 11:34 file1
[user2@localhost share]$ mv file1 file2
mv: cannot move ‘file1’ to ‘file2’: Operation not permitted
[user2@localhost share]$ rm file1
rm: remove write-protected regular empty file ‘file1’? y
rm: cannot remove ‘file1’: Operation not permitted
[user2@localhost share]$ ls -l
total 0
-rw-rw-r--. 1 user1 user1 0 Mar 5 11:34 file1
[user2@localhost share]$
从上面的示例中我们可以看到,user2
无法重命名或删除文件,因为该文件属于其他用户所有,而此行为是由粘滞位机制强制执行的。粘滞位使用的最佳示例是 /tmp/
目录。
# ls -ld /tmp/
drwxrwxrwt. 18 root root 480 Mar 5 11:42 /tmp/
任何用户都可以访问 /tmp/
,但是,为了防止其他用户重命名或删除不同用户拥有的文件,默认情况下将粘性位设置为此目录。为了完整起见,请注意,您可以通过已经提到的 chmod 命令从目录中删除粘滞位:
[root@localhost ~]# ls -ld /var/share/
drwxrwxrwt. 2 root root 4096 Mar 5 11:38 /var/share/
[root@localhost ~]# chmod -t /var/share/
[root@localhost ~]# ls -ld /var/share/
drwxrwxrwx. 2 root root 4096 Mar 5 11:38 /var/share/
[root@localhost ~]#