題 在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調用時隱藏的文件(名稱以點開頭),並且在以普通用戶身份運行時不顯示(按預期)。這不同於什麼 ls 在Linux上(來自的 coreutils)。

為什麼 ls 這樣做?


160
2018-06-23 15:36


起源


我誤讀了這些標籤,因為“OSX很糟糕”而且真的很困惑。 - Raystafarian
如果標籤允許大寫,那就不那麼容易混淆了 BSD 和 OSX在這裡更合適。 - ryenus
@Raystafarian很有趣,因為通常是相反的方式,人們試圖用標籤寫句子。 - Braiam


答案:


事實證明,這個功能不是特定於Apple的。這是BSD系統的一般特徵。

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

最初,我能夠追溯到它的來源 4.4BSD-精簡版。它已經存在於 這個FreeBSD提交 從1994年進口這些來源。

該功能也存在於OpenBSD中,可以在 這個提交 從1995年開始聲稱要從NetBSD導入代碼,所以這已經存在於 NetBSD的

然後,人們發現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覆蓋了這種行為 返工 稍晚一些。


405
2018-06-23 17:53



此外,值得注意的是,通過啟動它們來隱藏文件的“功能” . 是一個簡單的錯誤 - ls 只是應該隱藏 . 目錄,不是一切都以 .。快進幾十年,它常用於隱藏危險文件等,同時也用於隱藏系統配置等 - 所以讓管理員看到這些文件(用於維護配置或查找隱藏的惡意軟件等)是有意義的。 - Luaan
參考Luaan的評論: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (其中Rob Pike解釋說隱藏“點文件”開始是一個bug)。 - nibot
從POSIX原理,“ls實用程序的一些歷史實現顯示除了點和點之外的目錄中的所有條目,當超級用戶調用ls而不指定-a選項時。當”普通“用戶調用ls而不指定-a時,不應該看到有關名稱以<period>開頭的任何文件的信息,除非它們被命名為文件操作數。“ pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html - R..
它遠遠老了。我認為它早於SysV-BSD分裂,因為上次我訪問SysV系統時存在完全相同的行為。 - Joshua
史詩般的答案。歷史學習! - Corey Goldberg


這裡的 一條鏈接 到源代碼。注意 /* Root is -A automatically. */。這是Apple的BSD版本中的一個功能 ls


15
2018-06-23 16:03



有趣的發現。在執行ls時是否還有一種方法可以抑制隱藏文件? - Mr Lister
嗯, 好像 這不是Apple特有的功能,但它來自BSD世界? - kirelagin
是的,它不是特定於Apple的。謝謝你的回答,它讓我走上正軌。我用了 Root is -A automatically 用於搜索線索的字符串。 - kirelagin
Lister先生:您可以在許多操作系統上使用-I(大寫i)以root身份顯示點文件的顯示(FreeBSD,也可能是OS X) - Allan Jude


IIRC,在Usenet的早期(80年代早期)有一個關於這個問題的線索。該功能作為安全預防措施添加,以便惡意用戶無法輕易隱藏sysadmin / root中的文件/目錄/可執行文件。該理論基本上是“根本可以訪問所有內容,因此它應該能夠看到一切”。


1
2018-06-25 21:27



聽起來很合理(即使將文件轉換成點文件是一種“隱藏”它的可疑方式)。很高興找到那些檔案。 - kirelagin