可能你已经猜到了,Linux系统上共享文件的方法是创建组。但在一个完整的共享文件的环
境中,事情会复杂得多。
在7.3节中你已经看到,创建新文件时,Linux会用你默认的UID和GID给文件分配权限。想
让其他人也能访问文件,要么改变其他用户所在安全组的访问权限,要么就给文件分配一个包含
其他用户的新默认属组。
如果你想在大范围环境中创建文档并将文档与人共享,这会很烦琐。幸好有一种简单的方法
可以解决这个问题。
Linux还为每个文件和目录存储了3个额外的信息位。
- 设置用户ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。
- 设置组ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。
- 粘着位:进程结束后文件还驻留(粘着)在内存中。
SGID位对文件共享非常重要。启用SGID位后,你可以强制在一个共享目录下创建的新文件
都属于该目录的属组,这个组也就成为了每个用户的属组。
SGID可通过chmod命令设置。它会加到标准3位八进制值之前(组成4位八进制值),或者在
符号模式下用符号s。
如果你用的是八进制模式,你需要知道这些位的位置,如表7-6所示。
因此,要创建一个共享目录,使目录里的新文件都能沿用目录的属组,只需将该目录的SGID位置位。
$ mkdir testdir
$ ls -l
drwxrwxr-x 2 rich rich 4096 Sep 20 23:12 testdir/
$ chgrp shared testdir
$ chmod g+s testdir
$ ls -l
drwxrwsr-x 2 rich shared 4096 Sep 20 23:12 testdir/
$ umask 002
$ cd testdir
$ touch testfile
$ ls -l
total 0
-rw-rw-r— 1 rich shared 0 Sep 20 23:13 testfile
$
首先,用mkdir命令来创建希望共享的目录。然后通过chgrp命令将目录的默认属组改为包
含所有需要共享文件的用户的组(你必须是该组的成员)。最后,将目录的SGID位置位,以保证
目录中新建文件都用shared作为默认属组。
为了让这个环境能正常工作,所有组成员都需把他们的umask值设置成文件对属组成员可
写。在前面的例子中,umask改成了002,所以文件对属组是可写的。
做完了这些,组成员就能到共享目录下创建新文件了。跟期望的一样,新文件会沿用目录的
属组,而不是用户的默认属组。现在shared组的所有用户都能访问这个文件了。