it-swarm.com.de

Warum zeigt `Sudo ls` unter OS X versteckte (Punkt-) Dateien an?

Unter OS X Yosemite erhalte ich mit den folgenden Befehlen Folgendes:

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

Es zeigt versteckte Dateien (die Namen haben, die mit einem Punkt beginnen), wenn sie von root aufgerufen werden, und zeigt sie nicht (wie erwartet), wenn sie als normaler Benutzer ausgeführt werden. Dies unterscheidet sich von dem, was ls unter Linux (das von coreutils) macht.

Warum verhält sich ls so?

162
kirelagin

Es stellt sich heraus, dass diese Funktion nicht Apple-spezifisch ist. Dies ist eine Funktion von BSD-Systemen im Allgemeinen.

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

Anfangs konnte ich es auf die Quellen von 4.4BSD-Lite zurückführen. Es war bereits in diesem FreeBSD-Commit von 1994 vorhanden, das diese Quellen importiert.

Das Feature ist auch in OpenBSD vorhanden und befindet sich in this commit von 1995, das behauptet, Code von NetBSD zu importieren, also war dies bereits in NetBSD vorhanden.

Dann entdeckt man das Commit von NetBSD aus dem Jahr 1993, das behauptet, Code von 386BSD zu importieren, und das Feature ist bereits da . Außerdem zeigt this commit , dass es während der Entwicklung der 386BSD-Version 0.0 im Jahr 1991 vorhanden war, die, soweit ich das beurteilen kann, von BSD um 4.3 abging.

Der Kommentar erschien zum ersten Mal während der Entwicklung von 4.3BSD-Reno in this commit (27. Juni 1989) mit dem Titel "first working version of new ls". Der ursprüngliche Kommentar lautete:

/* root sees all files automatically */

das wurde später an diesem Tag geändert. (Ich bin nicht sicher, ob die Zeitstempel in diesem Repository vollständig korrekt sind.)

/* root is -A automatically */

Und erst 1992 wurden der Großbuchstabe und der Punkt hinzugefügt der Kommentar wird zu dem, was wir jetzt haben:

/* Root is -A automatically. */

Aber das Verhalten war in 2BSD ab dem 9. Mai 1979 vorhanden, wie in diesem Schnappschuss zu sehen:

Aflg = getuid() == 0;

Ich kann keine aktuelle Geschichte aus dieser Zeit finden, aber es gibt auch diesen Schnappschuss von 1BSD aus dem Jahr 1977 ohne diese Zeilen. Und ohne das -A Flag eigentlich.

Es scheint also, dass die Funktion irgendwo zwischen November 1977 (1BSD wird gerade entwickelt) und der Veröffentlichung von 2BSD im Mai 1979 eingeführt wurde.


Was ich bei dieser Untersuchung auch gefunden habe, ist das -I-Flag, das in FreeBSD im Jahr 2005 hinzugefügt wurde, um dieses Verhalten außer Kraft zu setzen, und etwas später überarbeitet wurde.

405
kirelagin

Hier ist ein Link zum Quellcode. Hinweis /* Root is -A automatically. */. Dies ist eine Funktion in Apples Version von BSD ls.

15
fd0

IIRC, es gab einen Thread darüber in den frühen Tagen des Usenet (Anfang der 80er Jahre). Die Funktion wurde als Sicherheitsmaßnahme hinzugefügt, damit böswillige Benutzer Dateien/Verzeichnisse/ausführbare Dateien nicht einfach vor sysadmin/root verstecken können. Die Theorie war im Grunde "root hat Zugriff auf alles, damit es alles sehen kann".

1
tachijuan