Warum werden unter "Sudo ls" versteckte (Punkt) Dateien angezeigt?

7568
kirelagin

Mit OS X Yosemite bekomme 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 (deren Namen mit einem Punkt beginnen) an, wenn sie von root aufgerufen werden, und zeigen sie nicht (wie erwartet) an, wenn sie als normaler Benutzer ausgeführt werden. Dies unterscheidet sich von dem, was lsunter Linux (dem, von dem es kommt coreutils) funktioniert.

Warum lsverhält es sich so?

160
Ich habe diese Tags falsch als "OSX ist schlecht" gelesen und bin wirklich verwirrt geworden. Raystafarian vor 8 Jahren 141
Es wäre weniger verwirrend, wenn Tags in Großbuchstaben zulässig sind, wobei "BSD" und "OSX" hier besser geeignet sind. ryenus vor 8 Jahren 5
@Raystafarian ziemlich witzig, weil normalerweise umgekehrt, Leute versuchen, Sätze mit Tags zu schreiben. Braiam vor 8 Jahren 0

3 Antworten auf die Frage

405
kirelagin

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 auf die Quellen von 4.4BSD-Lite zurückführen . Es war bereits in diesem FreeBSD-Commit aus dem Jahr 1994 enthalten, das diese Quellen importiert.

Die Funktion ist auch in OpenBSD vorhanden und kann in diesem Commit aus dem Jahr 1995 gefunden werden, das angibt, Code aus NetBSD zu importieren, sodass dieser bereits in NetBSD vorhanden war .

Dann entdeckt man das Commit von NetBSD aus dem Jahr 1993, das behauptet, Code aus 386BSD zu importieren, und die Funktion ist bereits vorhanden . Darüber hinaus zeigt dieses Commit, dass es während der Entwicklung der 386BSD-Version 0.0 im Jahr 1991 an der BSD-Version 4.3 lag, soweit ich das beurteilen kann.

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 neuer Ls". Der ursprüngliche Kommentar sagte:

/* root sees all files automatically */ 

die später am Tag geändert wurde (ich bin nicht sicher, ob die Zeitstempel in diesem Repository völlig korrekt sind) an:

/* root is -A automatically */ 

Und erst 1992 wurden der Großbuchstabe und die Periode hinzugefügt, wodurch der Kommentar zu dem wurde, was wir jetzt haben:

/* Root is -A automatically. */ 

Das Verhalten war jedoch in 2BSD ab dem 9. Mai 1979 wie in dieser Momentaufnahme zu sehen :

Aflg = getuid() == 0; 

Ich kann keine tatsächliche Geschichte aus diesen Zeiten finden, aber es gibt auch diese Momentaufnahme von 1BSD von 1977 ohne diese Zeilen. Und -Aeigentlich ohne Fahne.

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


Was ich auch bei dieser Untersuchung gefunden habe, ist die -IFlagge, die FreeBSD 2005 hinzugefügt wurde, um dieses Verhalten zu überschreiben, und wurde etwas später überarbeitet .

Es kann auch erwähnenswert sein, dass das "Feature" des Verdeckens von Dateien, indem sie mit "." Gestartet wurden, ein einfacher Fehler war - "ls" sollte nur das Verzeichnis "." Verstecken, nicht alles, das mit "." Beginnt. Schneller Vorlauf um einige Jahrzehnte; häufig werden sie zum Ausblenden gefährlicher Dateien usw. und zum Ausblenden der Systemkonfiguration usw. verwendet. Daher ist es sinnvoll, Administratoren diese Dateien anzeigen zu lassen (zum Verwalten der Konfiguration oder zum Auffinden versteckter Malware usw.). . Luaan vor 8 Jahren 52
Referenz für Luaans Kommentar: https://plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (in dem Rob Pike erklärt, dass "dot files" als Fehler ausgeblendet wurde). nibot vor 8 Jahren 23
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 aufrufen, ohne -a anzugeben, werden sie verwendet sollte keine Informationen zu Dateien anzeigen, deren Namen mit a beginnen es sei denn, sie wurden als Dateioperanden bezeichnet. "http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html R.. vor 8 Jahren 2
Es ist viel älter. Ich denke, es war vor der Spaltung von SysV-BSD, als ich das letzte Mal Zugriff auf SysV-Systeme hatte, dass genau dasselbe Verhalten vorhanden war. Joshua vor 8 Jahren 0
@Joshua: Ich bin durch Ihren Kommentar verwirrt. Diese Antwort führt das Feature auf 1977-1979 zurück, bevor System V existierte. ruakh vor 8 Jahren 0
epische Antwort Geschichte gelernt! Corey Goldberg vor 8 Jahren 3
Vielleicht ist es dann nur konvergent. Joshua vor 8 Jahren 0
15
fd0

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

Interessante Entdeckung. Gibt es auch eine Möglichkeit, versteckte Dateien zu unterdrücken, wenn Sie ein ls ausführen? Mr Lister vor 8 Jahren 0
Hm [sieht aus wie] (http://lists.freebsd.org/pipermail/freebsd-bugs/2007-March/022861.html) Dies ist kein Apple-spezifisches Feature, aber kommt es aus der BSD-Welt? kirelagin vor 8 Jahren 5
Richtig, es ist nicht Apple-spezifisch. Danke für Ihre Antwort, es hat mich auf den richtigen Weg gebracht. Ich habe die Zeichenfolge `Root is -A automatisch` verwendet, um nach Hinweisen zu suchen. kirelagin vor 8 Jahren 2
Herr Lister: Sie können die Anzeige der Punktdateien als root mit -I (Capital i) auf vielen Betriebssystemen (FreeBSD, also wahrscheinlich auch OS X) unterdrücken. Allan Jude vor 8 Jahren 0
1
tachijuan

IIRC, es gab einen Faden darüber in den frühen Tagen des Usenet (Anfang der 80er). Die Funktion wurde als Sicherheitsvorkehrung hinzugefügt, sodass böswillige Benutzer Dateien / Verzeichnisse / ausführbare Dateien nicht leicht vor dem sysadmin / root ausblenden können. Die Theorie lautete im Wesentlichen: "root hat Zugriff auf alles und sollte daher alles sehen können".

Klingt vernünftig (auch wenn aus einer Datei eine Punktdatei gemacht wird, ist dies eine fragwürdige Art, sie zu „verstecken“). Wäre toll, diese Archive zu finden. kirelagin vor 8 Jahren 0