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


Avec OS X Yosemite, en utilisant les commandes suivantes, j'obtiens les éléments suivants:

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

Il affiche les fichiers cachés (dont les noms commencent par un point) lorsqu'ils sont appelés par root et ne les affiche pas (comme prévu) lors de l'exécution en tant qu'utilisateur normal. Cela diffère de ce que ls sur Linux (celui qui vient de coreutils) Est-ce que.

Pourquoi ls se comporter de cette façon?


160
2018-06-23 15:36


origine


J'ai mal interprété ces balises car "OSX est mauvais" et je suis vraiment confus. - Raystafarian
Il serait moins déroutant si les balises sont autorisées en majuscule, BSD et OSXsont plus appropriés ici. - ryenus
@Raystafarian assez drôle, car normalement c'est l'inverse, les gens essaient d'écrire des phrases avec des tags. - Braiam


Réponses:


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ébut, j'ai pu retrouver les sources de 4.4BSD-Lite. Il était déjà présent dans cette validation FreeBSD à partir de 1994 qui importe ces sources.

La fonctionnalité est également présente dans OpenBSD et peut être trouvée dans ce commettre à partir de 1995 qui prétend importer du code de NetBSD, il était donc déjà présent 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à . En outre, ce commettre montre qu'il était présent lors du développement de la version 386BSD 0.0 en 1991, qui est passée de BSD autour de 4.3, pour autant que je sache.

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

/* root sees all files automatically */

ce qui était changé plus tard dans la journée (Je ne suis pas sûr que les horodatages sont entièrement corrects dans ce référentiel, cependant) pour:

/* root is -A automatically */

Et seulement en 1992 la majuscule et la période ont été ajoutés transformer le commentaire en ce que nous avons maintenant:

/* Root is -A automatically. */

Mais le comportement était présent dans 2BSD à partir du 9 mai 1979 comme on le voit dans cet instantané:

Aflg = getuid() == 0;

Je ne peux trouver aucune histoire réelle de ces temps, mais il y a aussi cet instantané de 1BSD de 1977 sans pour autant ces lignes. Et sans le -A drapeau en fait.

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


Ce que j'ai aussi trouvé lors de cette enquête, c'est le -I drapeau qui était ajouté à FreeBSD en 2005 pour remplacer ce comportement et était retravaillé un petit peu plus tard.


405
2018-06-23 17:53



En outre, il pourrait être intéressant de noter que la "fonctionnalité" de cacher des fichiers en les démarrant avec . était un simple bug - ls était seulement censé cacher la . répertoire, pas tout en commençant par .. Quelques décennies plus tard, il est souvent utilisé pour cacher des fichiers dangereux, tout en masquant la configuration du système, etc. - il est donc logique de laisser les administrateurs voir ces fichiers (pour maintenir la configuration ou trouver des logiciels malveillants cachés, etc.) . - Luaan
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
D'après la justification de 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 "appellent ls sans spécifier -a, ils ne devrait pas voir d’informations sur des fichiers dont le nom commence par <period>, sauf s’ils ont é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 qu'il est antérieur à la division 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
réponse épique. l'histoire a appris! - Corey Goldberg


Ici c'est un lien au code source. Remarque /* Root is -A automatically. */. Ceci est une fonctionnalité dans la version d'Apple de BSD ls.


15
2018-06-23 16:03



Trouvaille intéressante Existe-t-il également un moyen de supprimer les fichiers cachés lors de l'exécution d'un ls? - Mr Lister
Hm, ressemble à ce n'est pas une fonctionnalité spécifique à Apple, mais cela vient du monde BSD? - kirelagin
D'accord, ce n'est pas spécifique à Apple. Merci pour votre réponse, cela m'a mis sur la bonne voie. J'ai utilisé le Root is -A automatically chaîne pour rechercher des indices. - kirelagin
Mr Lister: vous pouvez supprimer l'affichage des fichiers de points en tant que root avec -I (majuscule i) sur de nombreux systèmes d'exploitation (FreeBSD, donc probablement aussi OS X) - Allan Jude


IIRC, il y avait un fil à ce sujet dans les premiers jours de Usenet (début des années 80). La fonctionnalité a été ajoutée par mesure de sécurité pour que les utilisateurs malveillants ne puissent pas facilement cacher les fichiers / répertoires / exécutables de sysadmin / root. La théorie était à la base "root a accès à tout pour pouvoir tout voir".


1
2018-06-25 21:27



Cela semble raisonnable (même si transformer un fichier en fichier de points est une manière discutable de le "cacher"). Serait génial de trouver ces archives. - kirelagin