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


162

使用OS X Yosemite,使用以下命令,我得到以下信息:

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

由root调用时,它显示隐藏文件(名称以点开头),而以普通用户身份运行时,则不显示它们(按预期)。这与lsLinux(来自的coreutils)不同。

为什么这样ls行事?


141
我将这些标签误读为“ OSX不好”,并感到非常困惑。
Raystafarian

5
如果标签都以大写字母允许的,这将是减少混乱BSDOSX更合适的位置。
ryenus

@Raystafarian很有趣,因为通常是相反的方式,人们试图用标签写句子。
Braiam 2015年

Answers:


404

事实证明,此功能不是Apple特有的。通常,这是BSD系统的功能。

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

最初,我能够将其追溯到4.4BSD-Lite的源。从1994年开始的FreeBSD承诺中就已经存在了,该承诺正在导入这些资源。

该功能也存在于OpenBSD中,可以在1995年的一次提交中找到,声明声称是从NetBSD导入代码,因此该功能已经存在于NetBSD中

然后人们发现NetBSD从1993年开始提交的声明声称是从386BSD导入代码,并且该功能已经存在。而且,此提交表明,在1991年的386BSD 0.0版的开发过程中,就在我看来,它是在4.3左右从BSD分叉的。

该注释是在4.3BSD-Reno的开发过程中第一次出现在此提交中(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发行之间引入的。


在这次调查中,我还发现了在2005年添加到FreeBSD中以覆盖此行为的-I标志,在稍后对其进行重新设计


52
另外,可能值得注意的是,以文件开头来隐藏文件的“功能” .是一个简单的错误- ls仅应隐藏.目录,而不是以文件开头的所有内容.。快进几十年,它通常用于隐藏危险文件等,同时也用于隐藏系统配置等。因此,让管理员查看这些文件(维护配置或查找隐藏的恶意软件等)是有意义的。 。
罗安2015年

23
Luaan的评论参考:plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp(Rob Pike在其中解释说,隐藏“点文件”是作为错误开始的)。
nibot

2
根据POSIX原理,“ ls实用程序的某些历史实现会在超级用户未指定-a选项的情况下调用ls时显示目录中除点和点-点之外的所有条目。当“普通”用户未指定-a时调用ls时,除非它们被命名为文件操作数,否则不应看到任何名称以<period>开头的文件的信息。” pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R.,

它远比它老。我认为这早于SysV-BSD分裂,因为上一次我访问SysV系统时,出现了完全相同的行为。
2015年

3
史诗般的答案。历史学到!
科里·戈德堡2015年

15

这是源代码的链接。注意/* Root is -A automatically. */。这是Apple的BSD版本中的功能ls


有趣的发现。执行ls时是否还可以抑制隐藏文件?
李斯特先生,2015年

5
嗯,看起来这不是Apple特有的功能,但它来自BSD世界吗?
kirelagin

2
是的,它不是特定于苹果的。感谢您的回答,这使我步入正轨。我用Root is -A automatically字符串搜索线索。
kirelagin

李斯特先生:在许多操作系统(FreeBSD,也可能是OS X)上,您可以使用-I(大写i)禁止以root身份显示点文件
Allan Jude 2015年

1

IIRC,在Usenet的早期(80年代初期)就有一个关于此的话题。添加该功能是为了安全起见,因此恶意用户无法轻易地从sysadmin / root隐藏文件/目录/可执行文件。该理论基本上是“ root可以访问所有内容,因此它应该能够看到所有内容”。


听起来很合理(即使将文件转换为点文件是“隐藏”它的可疑方式)。找到这些档案将是很棒的。
kirelagin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.