setgid 目录的目的是什么?

Xiè*_*léi 13 linux unix setgid posix

我知道setgid是如何工作的,但我不知道它是为什么设计的,有没有例子可以说明它解决了什么问题?

and*_*dol 19

虽然 setgid 文件/二进制文件可能不是很明显有用,但我确实发现 setgid 位在目录上非常有用。假设您是不同工作组的一部分,每个工作组都有自己的 unix(权限)组。那么您肯定希望将 setgid 位放在项目文件夹中,确保在创建新文件时应用正确的组所有权,从而允许该项目组中的同事访问这些文件?

  • 如果您正在使用 CVS,那么您可能非常熟悉它,因为这个原因(如果存储库中的目录不是 setgid,那么当不同的用户尝试签出和提交文件时,您会遇到很多权限错误) (2认同)

小智 13

主要用途是保留文件树的组所有者:

[lockie@bubbles tmp]$ mkdir dir1 && touch dir1/file && mkdir dir1/dir
[lockie@bubbles tmp]$ mkdir dir2 && chgrp staff dir2 && chmod 2755 dir2 && touch dir2/file && mkdir dir2/dir
[lockie@bubbles tmp]$ ls -al dir1
total 32
drwxrwxr-x   3 lockie  lockie   4096 Dec 13 19:32 .
drwxrwxrwt 125 root root 20480 Dec 13 19:32 ..
drwxrwxr-x   2 lockie  lockie   4096 Dec 13 19:32 dir
-rw-rw-r--   1 lockie  lockie      0 Dec 13 19:32 file
[lockie@bubbles tmp]$ ls -al dir2
total 32
drwxr-sr-x   3 lockie  staff  4096 Dec 13 19:32 .
drwxrwxrwt 125 root root  20480 Dec 13 19:32 ..
drwxrwsr-x   2 lockie  staff  4096 Dec 13 19:32 dir  < note new dir is g+s, owned by "staff" group, so the setgid behaviour acts recursively
-rw-rw-r--   1 lockie  staff     0 Dec 13 19:32 file < note new file is owned by "staff" group
[lockie@bubbles tmp]$
Run Code Online (Sandbox Code Playgroud)

这在不同用户将在一个目录下创建/编辑文件/目录的环境中往往很有用:当所有文件/目录共享同一个组时,所有用户都可以编辑/更改文件/目录(权限允许):这避免了情况例如“xyz 拥有文件 abc,所以我无法编辑它”。

以这种方式使用 setgid 的另一种方法是使用grpid文件系统挂载选项。

来自 man mount:

grpid 或 bsdgroups / nogrpid 或 sysvgroups

这些选项定义了新创建的文件获得的组 ID。当设置 grpid 时,它采用创建它的目录的组 ID;否则(默认)它采用当前进程的 fsgid,除非目录设置了 setgid 位,在这种情况下,它从父目录中获取 gid,如果它是一个目录本身,它也会获取 setgid 位设置。

启用后,在 grpid 挂载文件系统上创建的文件/目录也会继承父目录的组:

[lockie@bubbles ~]$ mount | grep /home
/dev/mapper/VolGroup00-home on /home type ext3 (rw,grpid)
[lockie@bubbles ~]$ mkdir dir3 && touch dir3/file && mkdir dir3/dir
[lockie@bubbles ~]$ ls -al dir3
total 12
drwxrwxr-x  3 lockie users 4096 Dec 13 19:37 .
drwxrwxr-x 12 lockie users 4096 Dec 13 19:37 ..
drwxrwxr-x  2 lockie users 4096 Dec 13 19:37 dir < inherited "users" group from parent dir
-rw-rw-r--  1 lockie users    0 Dec 13 19:37 file  < inherited "users" group from parent dir
[lockie@bubbles ~]$
Run Code Online (Sandbox Code Playgroud)

我发现使用grpid选项可以适当地减少人为错误的机会(因为文件系统可以完成工作,而不管目录权限如何)。