SUID, SGID and sticky bit

stick bit以前表示要把这个可执行文件放到swap分区中来加快执行速度,现在这个显然用不着了,因为Linux/Unix的vm子系统会自动完成这种功能。为了“变废为宝”,这个sticky bit并没有被遗弃,现在它的功能是这样的:对于一个目录,如果它被设置了sticky bit,那么它里面的文件只能被文件所有者,目录所有者,或特权用户删除。最好的一个例子是/tmp目录,在Fedora上它的权限是:

$ ls -ld /tmp/
drwxrwxrwt 50 root root 20480 03-09 21:08 /tmp/
$ test -k /tmp
$ echo $?
0

我们可以看到最后一个x变成了t。而如果目录或者文件不具有x权限,那么t就会变成T,比如:

$ touch foo.txt
$ chmod +t foo.txt
$ ls -l foo.txt
-rw-rw-r-T 1 wangcong wangcong 0 03-09 23:53 foo.txt

suid和sgid类似,它们的符号是s或者S而不是t。suid的含义是让可执行文件执行时具有owner的权限,sgid的含义是让其具有owner所在group的权限。例如:

$ ls -l /bin/ping
-rwsr-xr-x 1 root root 41748 2007-04-06 /bin/ping

如果你用ls -l看,你会发现suid的s是在owner权限一组,sgid的s是在group权限一组。

sgid用到目录上的含义是:里面的新文件或者子目录会继承这个group id。而在Linux上,suid用在目录上是被忽略的。

参考资料:
1. http://www.zzee.com/solutions/linux-permissions.shtml#setuid
2. http://www.unixguide.net/hp/faq/5.1.9.shtml.
3. http://en.wikipedia.org/wiki/Sticky_bit
4. http://en.wikipedia.org/wiki/Setuid