场景如下:我正在使用 Ubuntu Linux(如果重要的话,是 12.10),并且我有一个目录,其权限如下:
drwxrws--- paul www-data myfolder/
您可以看到setgid
位已设置。如果我更改此文件夹的任何权限(例如chmod o+x myfolder
),它会取消设置setgid
位。
根据chmod
的手册页:
修改模式保留目录
set-user-ID
和set-group-ID
位,除非您明确指定其他内容。
在其他地方,它表示setgid
如果文件组与用户的有效组 ID 不匹配,它将取消设置该位,但仅限于常规的文件(即,不是文件夹)。因此,由于我的组是paul
而不是www-data
,因此我预计如果是常规文件,上述情况就会发生myfolder/
,但事实并非如此——它是一个目录。
所以要么是我理解错了手册,要么chmod
就是没有遵守手册本身的说明。有人知道是哪一种吗?
答案1
在您引用的手册页的同一节中对此进行了解释chmod
SETUID 和 SETGID 位
[...]
这种行为依赖于取决于 政策和功能底层 chmod 系统调用. 如有疑问,请检查底层系统行为。
跟踪时chmod
它尝试设置 setgid 位但底层chmod()
系统调用会忽略它。
fchmodat(AT_FDCWD, "b", 02755) = 0
如您所见,S_ISGID (02000)
它是由chmod
命令设置的,而不是由chmod()
[here: fchmodat()
] 系统调用设置的:
drwxr-xr-x 2 me notmygrp 16 Mar 19 12:37 b
因此,如果您不是该组的成员,则删除目录的 setgid 位同样适用。