如何保证所有新建的子目录(以及子子目录等)都有g+s?

如何保证所有新建的子目录(以及子子目录等)都有g+s?

如果 的组/some/dirfoo,我跑

chmod g+s /some/dir

...那么 的任何孩子/some/dir也将有组foo

然而,至关重要的是,一个新的子目录/some/dir/subdir不是g+s(尽管,正如刚才所说,它的组将是foo)。

如何保证所有后代子目录/some/dir不仅继承组foo,而且继承g+s权限?

FWIW,我的umask是002,文件系统是nfs,选项mount(rw,relatime,vers=3,rsize=20961,wsize=413177,namlen=255,hard‌​,proto=tcp,timeo=450‌​,retrans=2,sec=sys,m‌​ountaddr=xxx.xxx.xxx‌​.xxx,mountvers=3,mou‌​ntport=333,mountprot‌​o=udp,local_lock=non‌​e,addr=xxx.xxx.xxx.x‌​xx)

更新: 我现在明白了我困惑的根源:有时更改目录的组(使用chgrp)具有禁用先前启用的 setgid 位的效果。例如

% rm -rf /some/dir
% mkdir -p /some/dir
% chmod g+s /some/dir
% ls -ld /some/dir
drwxrwsr-x 2 jones jones 0 Nov  7 07:13 /some/dir
% chgrp foo /some/dir
% ls -ld /some/dir
drwxrwxr-x 2 jones jones 0 Nov  7 07:13 /some/dir

(请注意,setgid 位最终未设置。)

正如我所说,这种情况只会发生有时。例如,如果我重复上面相同的序列,但chgrp在 下运行命令sudo,则该setgid位在末尾保持设置状态。

这种对权限的影响chgrp让我很失望。

答案1

一旦/some/dir有 setgid 位,新的子目录继承它,因此所有新创建的后代都有适当的组和 setgid 位。

使用chgrp可以删除 setgid 位。POSIX 说

除非 chgrp 由具有适当权限的进程调用,否则常规文件的 set-user-ID 和 set-group-ID 位应在成功完成后清除;其他文件类型的 set-user-ID 和 set-group-ID 位可能会被清除。

相关内容