在 OS X 上,为什么“sudo ls”会显示隐藏(点)文件?

在 OS X 上,为什么“sudo ls”会显示隐藏(点)文件?

使用 OS X Yosemite,使用以下命令,我得到以下结果:

$ touch .a
$ touch b
$ /bin/ls
b
$ /bin/ls -A
.a  b
$ sudo /bin/ls
.a  b

当由 root 调用时,它会显示隐藏文件(名称以点开头),而当以普通用户运行时,它不会显示这些文件(如预期的那样)。这与lsLinux 上(来自 的那个coreutils)的操作不同。

为什么会ls这样表现?

答案1

事实证明,此功能并非 Apple 独有。这是 BSD 系统的普遍功能。

/* Root is -A automatically. */
if (!getuid())
    f_listdot = 1;

最初,我能够追溯到4.4BSD-精简版。它已经存在于这个 FreeBSD 提交从 1994 年开始进口这些来源。

该功能也存在于 OpenBSD 中,可以在这次提交从 1995 年开始,声称从 NetBSD 导入代码,所以这在网络BSD

然后人们发现 1993 年 NetBSD 的提交声称正在从386BSD,并且该功能已经那里。 此外,这次提交据我所知,这表明它在 1991 年开发 386BSD 版本 0.0 时就已存在,该版本从 BSD 4.3 左右分叉而来。

该评论首次出现在4.3BSD-里诺这次提交(1989 年 6 月 27 日)题为“新 ls 的第一个工作版本”。原始评论说:

/* root sees all files automatically */

这是当天晚些时候改变(不过,我不确定此存储库中的时间戳是否完全正确)至:

/* root is -A automatically */

直到 1992 年,大写字母和句号添加将评论变成我们现在所拥有的:

/* Root is -A automatically. */

但这种行为在 1979 年 5 月 9 日起的 2BSD 中就已存在,如下所示此快照

Aflg = getuid() == 0;

我找不到当时的任何实际历史,但也有此快照自 1977 年起,1BSD没有这些线条。实际上没有-A旗帜。

因此,看来该功能是在 1977 年 11 月(当时正在开发 1BSD)和 1979 年 5 月 2BSD 发布之间某个时间推出的。


我在调查中还发现-I加入2005 年,FreeBSD 被引入以覆盖此行为,并且重新制作稍晚一些。

答案2

以下是一条链接源代码。注意/* Root is -A automatically. */。这是 Apple 版本的 BSD 的一个特性ls

答案3

我记得在 Usenet 早期(80 年代初期)曾有一个关于此问题的帖子。该功能是作为安全预防措施添加的,以便恶意用户无法轻易向系统管理员/root 隐藏文件/目录/可执行文件。该理论基本上是“root 可以访问所有内容,因此它应该能够看到所有内容”。

相关内容