chmod g[±]s
与suid密切相关的是sgid。sgid权限既适用于文件,也适用于目录。对于文件,sgid与suid的功能类似,只不过用户是以组的权限执行文件,而不是以拥有者的权限执行文件。例如,系统中的crontab命令就可能设置为sgid,以便用户就能够让cron为他们运行程序。不过,是以更加受限的crontab组,而不是以无所不能的root用户来运行程序。
$ ls -l /usr/bin/crontab
-rwxr-sr-x 1 root crontab ... /usr/bin/crontab
对于目录,sgid则会做些有趣的事情:任何后来在该目录中创建的文件都属于分配给该目录的组。下面的示例会将这些阐述得更明白。
假设有三个用户,Alice、Bob和Carol,他们都是admins组的成员。Alice的用户名是alice,她的主要组也是alice,Bob和Carol也遵循同样的模式,他们的用户名和主要组分别是bob和carol。如果Alice在admins组共享的目录中创建了一个文件,那么这个文件的拥有者和用户组就是alice,这意味着admins组的其他成员将不能写该文件。然而,在Alice创建新文件以后,她可以运行chgrp admins document(或chown :admins document)修改权限,但是这样很快就会变得相当烦琐。
不过,如果将共享目录设置为sgid,那么任何在该目录中创建的新文件的拥有者仍然是创建该文件的用户,但其用户组会自动地分配为共享目录的用户组。在这个例子中,为admins组。这样,Alice、Bob和Carol都能够读取和编辑在共享目录中创建的任何文件,而且实现的途径也最简捷。
同样,可以使用字母表示法或数字表示法设置sgid。使用字母时,设置sgid与设置suid类似,只是这里使用的是g,而不是u。将sgid应用于目录,如下所示。
$ ls -lF
drwxr-xr-x 11 scott admins ... bin/
$ chmod g+s bin
$ ls -lF
drwxr-Sr-x 11 scott admins ... bin/
说明:在表示设置了sgid权限时既使用了s,也使用了S。在设置sgid之前,如果用户组已经具有了执行权限(x),结果就会看到s;而S表示在设置sgid之前,还没有为用户组设置执行的权限。最终的结果是一样的,但是字母的大小写能够告诉你最初的情形是什么样的。
删除sgid权限的过程差不多就是与添加相反的过程。
$ ls -lF
drwxr-Sr-x 11 scott admins ... bin/
$ chmod g-s bin
$ ls -lF
drwxr-xr-x 11 scott admins ... bin/
在表示拥有者权限的数字之前,另外出现第四位数字,对于suid,那个数字是4;对于sgid,这个数字是2。
$ ls -lF
drwxr-xr-x 11 scott admins ... bin/
$ chmod 2755 bin
$ ls -lF
drwxr-Sr-x 11 scott admins ... bin/
删除sgid的方法和删除suid的方法是一样的,在开头输入0,就去掉了sgid权限。
$ ls -lF
drwxr-Sr-x 11 scott admins ... bin/
$ chmod 0755 bin
$ ls -lF
drwxr-xr-x 11 scott admins ... bin/
说明 :如果使用cp命令将文件复制到sgid目录,新复制过来的文件能够获得目录的用户组。但是如果用mv命令将文件移动到sgid目录,文件将仍然保持它当前所属的用户组,并不会获得目录的用户组。最后,如果用mkdir命令在sgid目录中创建新目录,它不仅能够继承sgid目录所属于的用户组,其本身也将拥有sgid权限。
chmod [±]t
sticky bit只能作用于目录。在文件夹设置了sticky bit以后,除了文件的拥有者或设置了sticky bit权限的目录的拥有者以外,其他用户都不能删除或重命名该目录中的文件。如果文件夹没有设置sticky bit权限,而且该文件夹对于用户来说是可写的,那么这些用户就可以删除或重命名这个目录中的任何文件。sticky bit权限就是用于防止这种情况发生的。这一权限最常用于/tmp目录,通常是将这个目录设计为允许所有人写入,但是/tmp目录中的单独文件和文件夹要通过sticky bit权限加以保护,以免其他用户破坏。
$ ls -l /
drwxrwxrwt 12 root root ... tmp
[Results truncated for length]
说明 在表示设置了sticky bit权限时既使用了t,也使用了T。在设置sticky bit之前,如果所有人(the world)已经具有了执行权限(x),结果就会看到t;而T表示在设置sticky bit之前,还没有为所有人(the world)设置执行的权限。最终的结果是一样的,但是大小写的区别能够告诉你最初的情况是什么样的。
也可以使用字母表示法或者数字表示法设置sticky bit。
$ ls -lF
drwxrwxr-x 2 scott family ... libby_pix/
$ chmod +t libby_pix
$ ls -lF
drwxrwxr-t 2 scott family ... libby_pix/
这里有两个地方容易让人混淆。首先,虽然前面的例子在用字母表示法设置权限时需要明确指定操作将会影响到谁(例如,必须输入一个u、g或者o),但是在设置sticky bit时则没有这个必要,只输入+t就可以了。
其次,注意出现在所有人(the world)的执行权限位置处的t,即使目录并不是所有人都可写的,它也仍然允许family组的成员能够对该目录进行写操作,同时也会阻止该组的成员删除文件,除非他们是文件的拥有者。
删除sticky bit的操作应该与你想象的一样直接。
$ ls -lF
drwxrwxr-t 2 scott family ... libby_pix/
$ chmod -t libby_pix
$ ls -lF
drwxrwxr-x 2 scott family ... libby_pix/
使用八进制权限表示法设置sticky bit也会涉及7.10节和7.11节中介绍过的第四位数字。suid使用的是4,sgid使用的是2,而sticky bit则使用1。
$ ls -lF
drwxrwxr-x 2 scott family ... libby_pix/
$ chmod 1775 libby_pix
$ ls -lF
drwxrwxr-t 2 scott family ... libby_pix/
同样,将权限位置为0可以取消sticky bit。
$ ls -lF
drwxrwxr-t 2 scott family ... libby_pix/
$ chmod 0775 libby_pix
$ ls -lF
drwxrwxr-x 2 scott family ... libby_pix/
在工作站(workstation)的很多目录上,sticky bit权限并不经常使用,但是在服务器上用起来相当方便。
提示:为了加快操作命令行的速度,可以同时设置suid、sgid和sticky bit权限的组合。与将4(读)、2(写)和1(执行)相加获得用户的数字权限一样,也可以对suid、sgid和sticky bit做同样的处理。如表-6所示。
表 6
数 字 | 含 义 |
---|---|
0 | 删除sticky bit、sgid和suid |
1 | 设置sticky bit |
2 | 设置sgid |
3 | 设置sticky bit和sgid |
4 | 设置suid |
5 | 设置sticky bit和suid |
6 | 设置sgid和suid |
7 | 设置sticky bit、sgid和suid |
一定要注意:用0会同时删除suid、sgid和sticky bit权限。如果用0删除suid,但仍然想设置sticky bit,就必须回去再重新设置sticky bit。