Frage Warum zeigt `sudo ls 'auf OS X versteckte (dot) Dateien?


Mit OS X Yosemite, mit den folgenden Befehlen, bekomme ich Folgendes:

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

Es zeigt versteckte Dateien an (deren Namen mit einem Punkt beginnen), wenn sie von root aufgerufen werden und zeigt sie (wie erwartet) nicht an, wenn sie als normaler Benutzer ausgeführt werden. Das unterscheidet sich von was ls auf Linux (der von coreutils) tut es.

Warum tut ls sich so benehmen?


160
2018-06-23 15:36


Ursprung


Ich habe diese Tags falsch gelesen, weil "OSX ist schlecht" und wurde wirklich verwirrt. - Raystafarian
Es wäre weniger verwirrend, wenn Tags in Großbuchstaben zulässig sind. BSD und OSXsind hier angemessener. - ryenus
@Raystafarian ziemlich lustig, denn normalerweise ist anders herum, Leute versuchen, Sätze mit Tags zu schreiben. - Braiam


Antworten:


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 war ich in der Lage, sie auf die Quellen von 4.4 BSD-Lite. Es war bereits in Dieses FreeBSD-Commit von 1994, die diese Quellen importiert.

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

Dann entdeckt man das Commit von NetBSD aus dem Jahr 1993, von dem behauptet wird, dass es Code von importiert 386BSDund das Feature ist bereits Dort. Außerdem, das begehen zeigt, dass es während der Entwicklung von 386BSD Version 0.0 im Jahr 1991 dort war, die sich von BSD um 4,3 gespalten hat, soweit ich das beurteilen kann.

Der Kommentar erschien zum ersten Mal während der Entwicklung von 4.3BSD-Reno im das begehen (27. Juni 1989) mit dem Titel "erste Arbeitsversion von neuem ls". Der ursprüngliche Kommentar sagte:

/* root sees all files automatically */

was war änderte später an diesem Tag (Ich bin nicht sicher, ob die Zeitstempel in diesem Repository korrekt sind)

/* root is -A automatically */

Und nur im Jahr 1992 der Großbuchstabe und der Zeitraum wurden hinzugefügt den Kommentar zu dem machen, was wir jetzt haben:

/* Root is -A automatically. */

Aber das Verhalten war ab dem 9. Mai 1979 in 2BSD zu finden dieser Schnappschuss:

Aflg = getuid() == 0;

Ich kann keine wirkliche Geschichte aus diesen Zeiten finden, aber es gibt auch dieser Schnappschuss von 1BSD von 1977 ohne diese Zeilen. Und ohne die -A Flagge tatsächlich.

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


Was ich während dieser Untersuchung auch gefunden habe, ist der -I Kennzeichnen Sie das wurde hinzugefügt FreeBSD im Jahr 2005 um dieses Verhalten zu überschreiben und war überarbeitet ein bisschen später.


405
2018-06-23 17:53



Es könnte auch erwähnenswert sein, dass das "Feature" zum Ausblenden von Dateien darin besteht, sie zu starten . war ein einfacher Fehler - ls sollte nur die verstecken . Verzeichnis, nicht alles beginnend mit .. Schneller Vorlauf ein paar Dekaden, und es wird häufig verwendet, um gefährliche Dateien zu verstecken, etc., um die Systemkonfiguration zu verstecken usw. - es macht also Sinn, Administratoren diese Dateien anzeigen zu lassen (um die Konfiguration zu behalten oder versteckte Malware zu finden etc.) . - Luaan
Referenz für Luaans Kommentar: plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (in dem Rob Pike erklärt, dass das Ausblenden von "dot files" als Bug gestartet wurde). - nibot
Aus der POSIX-Rationale: "Einige historische Implementierungen des Dienstprogramms ls zeigen alle Einträge in einem Verzeichnis außer Punkt und Punkt, wenn ein Superuser ls aufruft, ohne die Option -a anzugeben. Wenn" normale "Benutzer ls aufrufen, ohne -a anzugeben, werden sie verwendet Es sollten keine Informationen über Dateien mit Namen angezeigt werden, 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 älter. Ich denke, es ist älter als die SysV-BSD-Aufteilung, da das letzte Mal, als ich Zugang zu SysV-Systemen hatte, das exakt gleiche Verhalten vorhanden war. - Joshua
epische Antwort. Geschichte gelernt! - Corey Goldberg


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


15
2018-06-23 16:03



Interessanter Fund Gibt es auch eine Möglichkeit, versteckte Dateien zu unterdrücken, wenn Sie ein ls machen? - Mr Lister
Hm, sieht aus wie Dies ist keine Apple-spezifische Funktion, aber es kommt aus der BSD-Welt? - kirelagin
Richtig, es ist nicht Apple-spezifisch. Danke für deine Antwort, es hat mich auf den richtigen Weg gebracht. Ich habe das benutzt Root is -A automatically String, um nach Hinweisen zu suchen. - kirelagin
Herr Lister: Sie können die Anzeige der Punktdateien als root mit -I (Großbuchstaben i) auf vielen Betriebssystemen (FreeBSD, also wahrscheinlich auch OS X) unterdrücken - Allan Jude


IIRC, es gab einen Faden darüber in den frühen Tagen des Usenet (Anfang der 80er Jahre). Die Funktion wurde als Sicherheitsvorkehrung hinzugefügt, so dass böswillige Benutzer Dateien / Verzeichnisse / ausführbare Dateien nicht einfach aus dem sysadmin / root verstecken konnten. Die Theorie war im Grunde "Wurzel hat Zugang zu allem, so dass es in der Lage sein sollte, alles zu sehen".


1
2018-06-25 21:27



Hört sich vernünftig an (obwohl das Umwandeln einer Datei in eine dot-Datei eine fragwürdige Art ist, sie zu "verstecken"). Wäre toll, diese Archive zu finden. - kirelagin