在我们讨论什么是粘性位(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”,这意味着现在有一个粘性位,只有 root、文件或者目录所有者可以重命名和删除文件。
让我们复制上面的场景,让 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 ~]#