为什么不能用 chmod 通过八进制表示法清除 setuid/setgid/sticky 位?

为什么不能用 chmod 通过八进制表示法清除 setuid/setgid/sticky 位?

所以今天上班时,管理层突然出现并要求我为一群工程师开设 Linux 使用速成课程。显然,他们已经听说了我与微软的分歧(由于 Win 10 隐私和安全问题),现在我是 *nix 的常驻“专家”。

在向小组成员解释了 Linux 的简洁之美之后,他们提出了有关文件权限的问题。我解释了chmod分配权限的用户-组-世界八进制语法。

然后转到 setuid/setgid/sticky 位——我通过一个简单的示例进行演示,并chmod 2755 somefile.txt指出 setgid 位现在已启用。为了清除该位,我发出了chmod 0755,但令我沮丧的是,setgid 位仍然存在。什么??我知道我以前用过这种语法来清除粘性位(尽管可能是十年前)。在我刚刚夸赞过设计有多么优雅之后,发现它不起作用,真是令人尴尬。

无论如何,我还向他们展示了替代g+s速记g-s法并发现确实g-s有效。

演示结束后,我认为我发现了一个错误chmod,但在查看man页面后,我发现该行为是“设计使然”,因为有一个明确的说明指出chmod可以用来设置粘性标志,但不能清除它们。

为什么要删除使用八进制表示法清除粘性位的功能chmod?我在 Google 上搜索,发现有些人说前导零“令人困惑”,应该省略。真的吗?按照这种逻辑,我们不妨说字节(例如 ASCII 代码)包含前导“0”位是非法的,因为它“令人困惑”。觉得前导零令人困惑的人可以使用符号表示法。想要使用八进制表示法的人应该能够使用八进制。

为什么chmod不支持使用八进制表示法来清除粘着位?

答案1

问题是,在引入粘性位之前,已经有许多 shell 脚本等只使用三个八进制数字(或更少)。此外,任何数字都可以用前导零填充的惯例已经根深蒂固。

因此,如果允许使用以零开头的八进制形式重置粘滞位,许多脚本都会意外重置粘滞位。调试这将是一场噩梦,因此最终chmod限制您不能以八进制形式重置粘滞位。毕竟,如果您真的想重置它们(这种情况很少发生),您总是可以使用替代形式。

因此,与许多令人惊讶的复杂性一样,答案是“向后兼容”。

相关内容