使用 chmod 数字模式取消设置 setgid 位

Sco*_*lby 7 directory debian chmod setgid

chmod在取消设置 setgid 位时,我刚刚注意到一些有趣的行为:

$ mkdir test
$ chmod 2755 test
$ stat -c '%a %n' test
2755 test  # as expected
$ chmod 0755 test
$ stat -c '%a %n' test
2755 test  # what? see below
$ chmod 00755 test
$ stat -c '%a %n' test
755 test  # double what?!
Run Code Online (Sandbox Code Playgroud)

尝试取消设置 setgid 位chmod 0755不起作用,这令人惊讶。但是,手册页表明这是预期的行为:

SETUID 和 SETGID 位

如果文件的组 ID 与用户的有效组 ID 或用户的补充组 ID 之一不匹配,则 chmod 清除常规文件的 set-group-ID 位,除非用户具有适当的权限。其他限制可能会导致 MODE 或 RFILE 的 set-user-ID 和 set-group-ID 位被忽略。此行为取决于底层 chmod 系统调用的策略和功能。如有疑问,请检查底层系统行为。

除非您明确指定,否则 chmod 会保留目录的 set-user-ID 和 set-group-ID 位。您可以使用 u+s 和 gs 等符号模式设置或清除位,并且可以使用数字模式设置(但不清除)这些位。

(强调)

所以它似乎chmod 0755并不意味着取消 setgid 位。但是,为什么要chmod 00755取消设置呢?数字模式的五位数字chmod似乎没有任何用处。再次从手册页:

数字模式是从一到四个八进制数字 (0-7),通过将值 4、2 和 1 的位相加得出。假定省略的数字是前导零。

(强调)

这里发生了什么?为什么会chmod决定忽略单个前导 0?为什么它忽略两个前导 0?

(Debian Stretch 9.1,带有 chmod (GNU Coreutils) 8.6)

Sco*_*lby 8

我找到了!手册页中缺少此信息,但在 Coreutils 在线手册中。以机智:

在大多数系统上,如果设置了目录的 set-group-ID 位,则新创建的子文件继承与目录相同的组,新创建的子目录继承父目录的 set-group-ID 位。在一些系统上,目录的 set-user-ID 位对新子文件的所有权和新子目录的 set-user-ID 位具有类似的影响。通过减少使用chmodchown共享新文件的需要,这些机制使用户可以更轻松地共享文件。

这些便利机制依赖于目录的 set-user-ID 和 set-group-ID 位。如果命令喜欢chmodmkdir定期清除目录上的这些位,则该机制将不那么方便并且更难以共享文件。因此,像chmod这样的命令不会影响目录的 set-user-ID 或 set-group-ID 位,除非用户在符号模式下特别提及它们,或者使用运算符数字模式,例如“=755”,或设置以数字模式清除它们,或以具有五个或更多八进制数字的数字模式清除它们。

参考:https : //www.gnu.org/software/coreutils/manual/html_node/Directory-Setuid-and-Setgid.html