web-dev-qa-db-fra.com

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

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’ils sont appelés 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 ls sous Linux (celui provenant de coreutils) fait.

Pourquoi ls se comporte-t-il de cette façon?

161
kirelagin

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 cette commande FreeBSD à partir de 1994 qui importe ces sources.

La fonctionnalité est également présente dans OpenBSD et se trouve dans this commit à partir de 1995 qui prétend 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à ici . De plus, ce commit 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 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 était changé plus tard dans la journée } (cependant, 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 indiqué dans cet instantané }:

Aflg = getuid() == 0;

Je ne trouve aucun historique réel de cette époque, mais il y a aussi cet instantané de 1BSD à partir de 1977 sans ces lignes. Et sans le drapeau -A réellement.

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


Ce que j’ai également découvert au cours de cette enquête est le drapeau -I qui a été ajouté à FreeBSD en 2005 pour remplacer ce comportement et était retravaillé } un peu plus tard.

405
kirelagin

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

15
fd0

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 masquer des fichiers/répertoires/exécutables à partir de l'administrateur système/racine. La théorie était fondamentalement la suivante: "root a accès à tout, il devrait donc pouvoir tout voir".

1
tachijuan