Pourquoi ne puis-je pas répertorier un répertoire avec des autorisations de lecture?

14

J'ai créé un répertoire det un fichier à l' fintérieur. Je ne me suis alors accordé que des autorisations de lecture sur ce répertoire. Je comprends que cela devrait signifier que je peux lister les fichiers (par exemple ici ), mais je ne peux pas.

will@wrmpb /p/t/permissions> ls -al
total 0
drwxr-xr-x   3 will  wheel  102  4 Oct 08:30 .
drwxrwxrwt  16 root  wheel  544  4 Oct 08:30 ..
dr--------   3 will  wheel  102  4 Oct 08:42 d
will@wrmpb /p/t/permissions> ls d
will@wrmpb /p/t/permissions>

Si je modifie les autorisations pour écrire et exécuter, je peux voir le fichier.

will@wrmpb /p/t/permissions> chmod 500 d
will@wrmpb /p/t/permissions> ls d
f
will@wrmpb /p/t/permissions> 

Pourquoi est-ce? J'utilise MacOS.

Edit: en référence à la réponse de @ ccorn, il est pertinent que j'utilise du poisson et type lsdonne ce qui suit:

will@wrmpb /p/t/permissions> type ls
ls is a function with definition
function ls --description 'List contents of directory'
    command ls -G $argv
end
wrgrs
la source
Le doublon ne répond pas à la question. Cela implique que vous pouvez faire ce que je démontre que vous ne pouvez pas. La réponse de @ ccorn est parfaite.
Wrgrs
Wow, la chose Fish est une information assez importante (initialement) manquante.
Stephen Kitt
Oui, vous avez raison, j'aurais dû l'ajouter, mais il semble que la même chose se produirait en bash si vous alias ls='ls -G', ce que je pense que beaucoup de gens font.
wrgrs
C'est pour moi. Êtes-vous sur MacOS? Il y a peut-être une autre question ici. Edit: oui, j'ai un comportement différent sous Linux.
wrgrs

Réponses:

8

Quelques préparatifs, juste pour s'assurer que lscela n'essaye pas plus de choses qu'il ne devrait:

$ unalias ls 2>/dev/null
$ unset -f ls
$ unset CLICOLOR

Démonstration de l' rautorisation de répertoire:

$ ls -ld d
dr--------  3 ccorn  ccorn  102  4 Okt 14:35 d
$ ls d
f
$ ls -l d
ls: f: Permission denied
$ ls -F d
ls: f: Permission denied

Dans les systèmes de fichiers Unix traditionnels, un répertoire était simplement une liste de paires (nom, numéro d'inode). Un numéro d'inode est un entier utilisé comme index dans la table d'inode du système de fichiers où le reste des métadonnées du fichier est stocké.

L' rautorisation sur un répertoire permet de répertorier les noms qu'il contient, mais pas d'accéder aux informations stockées dans la table inode, c'est-à-dire d'obtenir le type de fichier, la longueur du fichier, les autorisations de fichier, etc., ou d'ouvrir le fichier. Pour cela, vous avez besoin de l' xautorisation sur le répertoire.

Voilà pourquoi ls -l, ls -F, lsavec sortie code couleur etc échouer sans xautorisation, alors qu'un simple lsréussit.

L' xautorisation seule permet l'accès à l'inode, c'est-à-dire, étant donné un nom explicite dans ce répertoire, xpermet de rechercher son inode et d'accéder aux métadonnées de cette entrée de répertoire:

$ chmod 100 d
$ ls -l d/f
-rw-r--r--  1 ccorn  ccorn  0  4 Okt 14:35 d/f
$ ls d
ls: d: Permission denied

Par conséquent, d'ouvrir un fichier /a/b/c/fou la liste de ses métadonnées, les répertoires /, /a, /a/bet /a/b/cdoit être accordé la xpermission.

Sans surprise, la création d'entrées d'annuaire nécessite à la fois wet des xautorisations:

$ chmod 100 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 200 d
$ touch d/g
touch: d/g: Permission denied
$ chmod 300 d
$ touch d/g
$

Wikipedia a un bref aperçu dans un article sur les autorisations du système de fichiers .

ccorn
la source
Incroyable. /bin/ls dmontre le contenu pour moi. Merci!
Wrgrs
OK, c'était donc un problème de redéfinition (avec -Gpour la sortie colorisée, qui a besoin de métadonnées, donc de xperms). Par conséquent mes préparatifs avec unalias lset unset CLICOLOR. J'aurais dû ajouter unset -f lspour supprimer également une telle définition de fonction. Édité.
ccorn
4

Pour lire un répertoire, vous devez également pouvoir le parcourir (le bit x). Donc, au minimum, vous avez besoin de rx pour qu'un répertoire puisse y accéder de quelque manière que ce soit.

Soruk
la source
2
Non, tu ne le fais pas; lsdevrait toujours être en mesure de répertorier les fichiers dans le répertoire, même si le répertoire n'est pas exécutable.
Stephen Kitt
Vous pouvez laisser l'autorisation de lecture désactivée. Vous pourrez alors accéder aux fichiers mais pas lister le contenu du répertoire.
Kusalananda
@Kusalananda - bon point, en effet je l'utilise de temps en temps.
Soruk
@Stephen Kitt - Peut-être que cela DEVRAIT, mais l'implémentation est que non.
Soruk
1
@Soruk et donc la question demeure: pourquoi pas?
Stephen Kitt