Sous OS X, pourquoi `sudo ls` affiche-t-il les fichiers cachés?

162

Avec OS X Yosemite, j'utilise les commandes suivantes:

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

Il affiche les fichiers cachés (dont le nom commence par un point) lorsqu'il est appelé par root et ne les affiche pas (comme prévu) lorsqu'il est exécuté en tant qu'utilisateur normal. Cela diffère de ce que fait lsLinux (celui qui vient de coreutils).

Pourquoi lsse comporte de cette façon?

kirelagin
la source
141
J'ai mal interprété ces balises comme "OSX est mauvais" et je suis devenu vraiment confus.
Raystafarian
5
Il serait moins déroutant si les balises sont autorisées en majuscules BSDet OSXsont plus appropriées ici.
ryenus
@ Raystafarian est assez drôle, parce que normalement, c'est l'inverse, les gens essaient d'écrire des phrases avec des balises.
Braiam

Réponses:

404

Il s'avère que cette fonctionnalité n'est pas spécifique à Apple. Ceci est une caractéristique des systèmes BSD en général.

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

Au départ, je pouvais le retrouver dans les sources de 4.4BSD-Lite . Il était déjà présent dans cet engagement FreeBSD depuis 1994 qui importait ces sources.

La fonctionnalité est également présente dans OpenBSD et se trouve dans ce commit de 1995 prétendant importer du code à partir de NetBSD. Elle était donc déjà présente dans NetBSD .

Ensuite, on découvre le commit de NetBSD de 1993 qui prétend importer du code de 386BSD , et la fonctionnalité est déjà présente . En outre, cet engagement montre qu’il était présent lors du développement de la version 0.0 de 386BSD en 1991, qui est passé de BSD à la version 4.3, pour autant que je sache.

Le commentaire est apparu pour la première fois lors du développement de la 4.3BSD-Reno dans ce commit (27 juin 1989) intitulé "première version de travail de new ls". Le commentaire original disait:

/* root sees all files automatically */

qui a été changé plus tard dans la journée (je ne suis pas sûr que les horodatages soient tout à fait corrects dans ce référentiel):

/* root is -A automatically */

Et seulement en 1992, la lettre majuscule et la période ont été ajoutées, transformant le commentaire en ce que nous avons maintenant:

/* Root is -A automatically. */

Mais le comportement était présent dans 2BSD à compter du 9 mai 1979, comme le montre cet instantané :

Aflg = getuid() == 0;

Je ne peux trouver aucune histoire réelle de cette époque, mais il y a aussi cet instantané de 1BSD de 1977 sans ces lignes. Et sans le -Adrapeau en fait.

Il semble donc que la fonctionnalité ait été introduite quelque part entre novembre 1977 (1BSD en cours de développement à ce moment-là) et la sortie de 2BSD en mai 1979.


Ce que j’ai également découvert lors de cette enquête, c’est le -Idrapeau ajouté à FreeBSD en 2005 pour remplacer ce comportement et qui a été retravaillé un peu plus tard.

kirelagin
la source
52
En outre, il peut être intéressant de noter que la "fonctionnalité" de masquer des fichiers en les commençant par .un simple bug lsétait supposée masquer le .répertoire, pas tout ce qui commençait par .. Quelques décennies plus tard, il est généralement utilisé pour masquer des fichiers dangereux, etc., mais également pour masquer la configuration du système, etc. .
Luaan
23
Référence pour le commentaire de Luaan : plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp (dans lequel Rob Pike explique que cacher des "fichiers de points" a commencé comme un bogue).
Nibot
2
Du point de vue de la logique POSIX, "Certaines implémentations historiques de l'utilitaire ls affichent toutes les entrées d'un répertoire, à l'exception des points et des points, lorsqu'un superutilisateur appelle ls sans spécifier l'option -a. Lorsque des utilisateurs" normaux "invoquent ls sans spécifier -a, ils ne devrait pas voir d’informations sur les fichiers dont le nom commence par un <point>, à moins qu’ils aient été nommés en tant qu’opérandes de fichier. " pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html
R ..
C'est beaucoup plus vieux. Je pense que cela est antérieur à la scission SysV-BSD car la dernière fois que j'ai eu accès aux systèmes SysV, le même comportement était présent.
Joshua
3
réponse épique. histoire apprise!
Corey Goldberg
15

Voici un lien vers le code source. Remarque /* Root is -A automatically. */. Ceci est une fonctionnalité de la version Apple de BSD ls.

fd0
la source
Découverte intéressante. Existe-t-il également un moyen de supprimer les fichiers cachés lorsque vous faites un ls?
M. Lister
5
Hm, on dirait que ce n'est pas une fonctionnalité spécifique à Apple, mais qu'elle vient du monde BSD?
Kirelagin
2
Bon, ce n'est pas spécifique à Apple. Merci pour votre réponse, cela m'a mis sur la bonne voie. J'ai utilisé la Root is -A automaticallychaîne pour rechercher des indices.
Kirelagin
M. Lister: vous pouvez supprimer l'affichage des fichiers de points en tant que root avec -I (capital i) sur de nombreux systèmes d'exploitation (FreeBSD, donc probablement aussi sur OS X)
Allan Jude
1

IIRC, il y avait un fil à ce sujet au début de Usenet (début des années 80). La fonctionnalité a été ajoutée à titre de mesure de sécurité afin que les utilisateurs malveillants ne puissent pas facilement cacher des fichiers / répertoires / exécutables à l’adresse sysadmin / root. La théorie était fondamentalement la suivante: "root a accès à tout, il devrait donc pouvoir tout voir".

tachijuan
la source
Cela semble raisonnable (même si transformer un fichier en fichier de points est un moyen discutable de le "cacher"). Ce serait génial de trouver ces archives.
Kirelagin