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

162

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 lsunter Linux (demjenigen, von dem es stammt coreutils) gemacht wird.

Warum lsverhält es sich so?

kirelagin
quelle
141
Ich habe diese Tags falsch verstanden als "OSX ist schlecht" und war wirklich verwirrt.
Raystafarian
5
Es wäre weniger verwirrend, wenn Tags in Großbuchstaben zulässig BSDund OSXhier angemessener wären .
Ryenus
@Raystafarian ganz lustig, weil normalerweise anders herum Leute versuchen, Sätze mit Tags zu schreiben.
Braiam,

Antworten:

404

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

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

Anfangs konnte ich es bis zu den Quellen von 4.4BSD-Lite zurückverfolgen . Es war bereits in diesem FreeBSD-Commit von 1994 enthalten, das diese Quellen importiert.

Das Feature ist auch in OpenBSD vorhanden und kann in diesem Commit von 1995 gefunden werden, das behauptet, Code von NetBSD zu importieren, so dass dies bereits in NetBSD vorhanden war .

Dann entdeckt man das Commit von NetBSD aus dem Jahr 1993, das behauptet, Code von 386BSD zu importieren , und das Feature ist bereits vorhanden . Darüber hinaus zeigt dieses 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 diesem Commit (27. Juni 1989) mit dem Titel "Erste Arbeitsversion von new ls". Der ursprüngliche Kommentar lautete:

/* root sees all files automatically */

die später an diesem Tag geändert wurde (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 , was den Kommentar zu dem macht, 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 von 1977 ohne diese Zeilen. Und -Aeigentlich ohne Flagge.

Es scheint also, dass das Feature 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 -IFlag, das 2005 zu FreeBSD hinzugefügt wurde , um dieses Verhalten zu überschreiben, und etwas später überarbeitet wurde .

kirelagin
quelle
52
Es kann auch erwähnenswert sein, dass das "Feature" des Versteckens von Dateien durch Starten .ein einfacher Fehler war - es lssollte nur das .Verzeichnis verbergen , nicht alles, was mit beginnt .. Ein paar Jahrzehnte schneller Vorlauf, der häufig zum Verbergen gefährlicher Dateien usw. und gleichzeitig zum Verbergen der Systemkonfiguration usw. verwendet wird. Es ist daher sinnvoll, Administratoren diese Dateien anzeigen zu lassen (um die Konfiguration beizubehalten oder versteckte Malware usw. zu finden). .
Luaan,
23
Referenz für Luaans Kommentar: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (in dem Rob Pike erklärt, dass das Ausblenden von " Punktedateien " als Fehler begann).
Nibot
2
Aus der POSIX-Begründung: "Einige historische Implementierungen des Dienstprogramms ls zeigen alle Einträge in einem Verzeichnis mit Ausnahme von dot und dot-dot an, wenn ein Superuser ls ohne Angabe der Option -a aufruft. Wenn" normale "Benutzer ls ohne Angabe von -a aufrufen, werden sie angezeigt sollten keine Informationen zu Dateien mit Namen sehen, die mit einem <Punkt> beginnen, es sei denn, sie wurden als Dateioperanden benannt. " pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R ..
Es ist viel viel älter. Ich denke, es ist älter als der SysV-BSD-Split, als ich das letzte Mal Zugriff auf SysV-Systeme hatte und genau dasselbe Verhalten vorlag.
Joshua
3
epische Antwort. Geschichte gelernt!
Corey Goldberg
15

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

fd0
quelle
Interessante Entdeckung. Gibt es auch eine Möglichkeit, versteckte Dateien zu unterdrücken, wenn ein ls ausgeführt wird?
Mr Lister
5
Hm, sieht so aus, als wäre dies kein Apple-spezifisches Feature, aber es kommt aus der BSD-Welt?
kirelagin
2
Richtig, es ist nicht Apple-spezifisch. Vielen Dank für Ihre Antwort, es hat mich auf den richtigen Weg gebracht. Ich habe die Root is -A automaticallyZeichenfolge verwendet, um nach Hinweisen zu suchen.
kirelagin
Herr Lister: Sie können die Anzeige der Punktedateien als root mit -I (Großbuchstaben i) auf vielen Betriebssystemen unterdrücken (FreeBSD, also wahrscheinlich auch OS X)
Allan Jude
1

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 Zugang zu allem, damit es alles sehen kann".

Tachijuan
quelle
Klingt vernünftig (obwohl es fraglich ist, eine Datei in eine Punktdatei zu verwandeln, um sie zu „verstecken“). Wäre toll, diese Archive zu finden.
kirelagin