Pourquoi '/' a-t-il une entrée '..'?

81

Cela m'a toujours intrigué. Pourquoi le répertoire racine contient-il une référence à un répertoire parent?

bob @ bob: / $ ls -a
. construire la maison lib32 mnt .rpmdb sys vmlinuz
.. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old
bin dev initrd.img.old perdus + trouvés proc selinux usr
démarrage etc lib media racine srv var

Je comprends comment les répertoires sont gérés dans le système de fichiers - chaque répertoire a n + 2 pointeurs sur lui-même (n = nombre de sous-répertoires dans le répertoire). Un pour chaque sous-répertoire immédiat, un pour son parent et un pour lui-même.

Mais quel est /le parent?

Nathan Osman
la source

Réponses:

73

/..points à /:

$ ls -id /
2 /
$ ls -id /..
2 /..

Les deux ont le même numéro d'inode, qui se trouve être 2 sur ce système. (La valeur exacte n'a pas d'importance.)

C'est fait pour la cohérence. De cette façon, il n’est pas nécessaire que le noyau contienne du code pour vérifier son état actuel lorsqu’il traite un ..dans un chemin. Vous pouvez dire cd ..pour toujours et ne jamais aller plus loin que la racine.

Warren Young
la source
20
@ George Je crois que les exploits qui tirent parti des chemins relatifs l'utilisent; vous n'avez pas à deviner le dossier actuel, vous venez juste de le faire../../../../../../../../../../../../../../../../etc/passwd
Michael Mrozek
21
Quelle différence cela ferait-il si vous utilisiez simplement / etc / passwd?
Jlliagre
9
@jlliagre: Il existe des programmes qui vérifient si un fichier se trouve dans le répertoire actuel en vérifiant s'il commence par /. Entre ../(pas nécessairement au début!) Et les liens symboliques, c'est très difficile à faire, d'autant plus que l'attaquant peut être en train de déplacer des répertoires sous le nez du programme.
Gilles le
4
Je vois, ils devraient au moins utiliser canonicalize_file_name ou realpath.
Jlliagre
5
@musiphil: C'est une bonne chose. Michael soulignait juste que c'est une fonctionnalité qui peut être exploitée à des fins malveillantes, si le code n'est pas écrit pour faire face à l'exploit. Si nous nous débarrassions de toutes les fonctionnalités exploitables, les ordinateurs seraient très ennuyeux.
Warren Young
38

C'est là parce que c'est une garantie faite par Unix: chaque répertoire contient deux entrées, .qui se réfèrent à elles-mêmes et ..qui font référence au parent.

Le répertoire racine de l’espace de noms actuel est spécial, car il ..pointe vers la même chose que ., mais pas si spécial, pour casser la garantie offerte par le système d’exploitation aux programmes. Lorsque ces contrats sont rompus, les choses tournent mal et tout le monde pointe du doigt.

Le répertoire racine que vous voyez peut, dans le système de fichiers sur le disque, avoir en réalité un répertoire parent différent. C'est la vue des systèmes de fichiers fournie dans l'espace de noms monté qui applique la .. = .règle /. Donc , si vous êtes dans une chroot()prison, vous verrez /.. = /bien que quelqu'un en dehors de la prison regardant /path/to/jail/..verra à la /path/toplace.

Phil P
la source
1
Combien de programmes dépendent du "contrat" ​​qui /a ..cela pointe sur lui-même? Je pense que cela aurait pu être également (ou plus) acceptable de /ne pas en avoir ...
musiphil
Quelqu'un at-il une source qui confirme cette théorie?
Julian Hollmann
1
Eh bien, man 5 dirsur un système BSD vous guidera à travers l'API documentée, et les éléments énoncés dans l'API faites partie du contrat.
Phil P
1
find a une optimisation qui repose sur le contrat n + 2.
ctrl-alt-delor
2
Oh, et bien sûr si vous voulez une source, lisez la spécification. POSIX à pubs.opengroup.org/onlinepubs/9699919799 in section 4.12: "Le nom de fichier spécial dot doit faire référence au répertoire spécifié par son prédécesseur. Le nom de fichier spécial dot-dot doit faire référence au répertoire parent de son répertoire prédécesseur. Dans ce cas, dans le répertoire racine, point-point peut faire référence au répertoire racine lui-même. "
Phil P