7.12 设置和清除sticky bit

chmod [+-]t

除了是一个可以脱口而出的有趣短语以外,sticky bit还有什么意思呢? 在以前的Unix中,如果可执行文件设置了sticky bit,OS就会知道这个文件将需要不断地运行,所以就把它保存在交换区,以便能够快速而有效地访问它。Linux是一个较新的系统,它会忽略在文件上设置的sticky bit权限。

这意味着sticky bit只能作用于目录。在文件夹设置了sticky bit以后,除了文件的拥有者或设置了sticky bit权限的目录的拥有者以外,其他用户都不能删除或重命名该目录中的文件。如果文件夹没有设置sticky bit权限,而且该文件夹对于用户来说是可写的,那么这些用户就可以删除或重命名这个目录中的任何文件。sticky bit权限就是用于防止这种情况发生的。这一权限最常用于/tmp目录,通常是将这个目录设计为允许所有人写入,但是/tmp目录中的单独文件和文件夹要通过sticky bit权限加以保护,以免其他用户破坏。

  1. $ ls -l /
  2. drwxrwxrwt 12 root root ... tmp
  3. [Results truncated for length]

说明 或许你可能看到在表示设置了sticky bit权限时既使用了t,也使用了T。在设置sticky bit之前,如果所有人(the world)已经具有了执行权限(x),结果就会看到t;而T表示在设置sticky bit之前,还没有为所有人(the world)设置执行的权限。最终的结果是一样的,但是大小写的区别能够告诉你最初的情况是什么样的。

与本章中很多使用chmod命令的例子一样,也可以使用字母表示法或者数字表示法设置sticky bit。

  1. $ ls -lF
  2. drwxrwxr-x 2 scott family ... libby_pix/
  3. $ chmod +t libby_pix
  4. $ ls -lF
  5. drwxrwxr-t 2 scott family ... libby_pix/

这里有两个地方容易让人混淆。首先,虽然前面的例子在用字母表示法设置权限时需要明确指定操作将会影响到谁(例如,必须输入一个ug或者o),但是在设置sticky bit时则没有这个必要,只输入+t就可以了。

其次,注意出现在所有人(the world)的执行权限位置处的t,即使目录并不是所有人都可写的,它也仍然允许family组的成员能够对该目录进行写操作,同时也会阻止该组的成员删除文件,除非他们是文件的拥有者。

删除sticky bit的操作应该与你想象的一样直接。

  1. $ ls -lF
  2. drwxrwxr-t 2 scott family ... libby_pix/
  3. $ chmod -t libby_pix
  4. $ ls -lF
  5. drwxrwxr-x 2 scott family ... libby_pix/

使用八进制权限表示法设置sticky bit也会涉及7.10节和7.11节中介绍过的第四位数字。suid使用的是4,sgid使用的是2,而sticky bit则使用1。(看出规律了吗?)

  1. $ ls -lF
  2. drwxrwxr-x 2 scott family ... libby_pix/
  3. $ chmod 1775 libby_pix
  4. $ ls -lF
  5. drwxrwxr-t 2 scott family ... libby_pix/

同样,将权限位置为0可以取消sticky bit。

  1. $ ls -lF
  2. drwxrwxr-t 2 scott family ... libby_pix/
  3. $ chmod 0775 libby_pix
  4. $ ls -lF
  5. drwxrwxr-x 2 scott family ... libby_pix/

在工作站(workstation)的很多目录上,sticky bit权限并不经常使用,但是在服务器上用起来相当方便。记住这个命令吧,你将发现它还能够解决其他一些棘手的权限问题。

提示 为了加快操作命令行的速度,可以同时设置suidsgid和sticky bit权限的组合。与将4(读)、2(写)和1(执行)相加获得用户的数字权限一样,也可以对suidsgid和sticky bit做同样的处理。如表7-6所示。

表 7-6

数  字 含  义
0 删除sticky bit、sgidsuid
1 设置sticky bit
2 设置sgid
3 设置sticky bit和sgid
4 设置suid
5 设置sticky bit和suid
6 设置sgidsuid
7 设置sticky bit、sgidsuid

一定要注意:用0会同时删除suidsgid和sticky bit权限。如果用0删除suid,但仍然想设置sticky bit,就必须回去再重新设置sticky bit。