¿Por qué '/' tiene una entrada '..'?

81

Esto siempre me ha confundido. ¿Por qué el directorio raíz contiene una referencia a un directorio padre?

bob @ bob: / $ ls -a
. construir casa lib32 mnt .rpmdb sys vmlinuz
.. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old
bin dev initrd.img.old perdido + encontrado proc selinux usr
boot etc lib media root srv var

Entiendo cómo se administran los directorios en el sistema de archivos: cada directorio tiene n + 2 punteros para sí mismo (n = número de subdirectorios dentro del directorio). Uno para cada subdirectorio inmediato, uno para su padre y otro para sí mismo.

Pero, ¿cuál es /el padre?

Nathan Osman
fuente

Respuestas:

73

/..señala a /:

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

Ambos tienen el mismo número de inodo, que resulta ser 2 en este sistema. (El valor exacto no importa).

Se hace por consistencia. De esta manera, no tiene que haber código en el núcleo para verificar dónde está actualmente cuando procesa ..una ruta. Puedes decir cd ..para siempre, y nunca ir más profundo que la raíz.

Warren Young
fuente
20
@ George Creo que las hazañas que aprovechan las rutas relativas usan eso; no tienes que adivinar la carpeta actual, solo debes hacerlo../../../../../../../../../../../../../../../../etc/passwd
Michael Mrozek
21
¿Qué diferencia haría eso simplemente usando / etc / passwd?
jlliagre
99
@jlliagre: hay programas que comprueban si un archivo está en el directorio actual probando si comienza con él /. Entre ../(¡no necesariamente al principio!) Y enlaces simbólicos, es muy difícil de hacer, especialmente teniendo en cuenta que el atacante puede estar moviendo directorios bajo la nariz del programa.
Gilles
44
Ya veo, al menos deberían usar canonicalize_file_name o realpath.
jlliagre
55
@musiphil: es algo bueno. Michael solo estaba señalando que es una característica que puede explotarse para fines negativos, si el código no está escrito para hacer frente al exploit. Si nos deshiciéramos de todas las características que pueden explotarse, las computadoras serían muy aburridas.
Warren Young
38

Está ahí porque es una garantía hecha por Unix: cada directorio contiene dos entradas, .que se refiere a sí mismo y ..que se refiere al padre.

El directorio raíz del espacio de nombres actual es especial, ya que ..apunta a lo mismo ., pero no es tan especial para romper la garantía hecha por el sistema operativo a los programas. Cuando se rompen esos contratos, las cosas salen mal y todos señalan con el dedo.

El directorio raíz que ve podría, en el sistema de archivos en el disco, tener un directorio padre diferente. La vista de los sistemas de archivos proporcionados en el espacio de nombres montado es lo que hace cumplir la .. = .regla /. Entonces, si estás en una chroot()cárcel, verás /.. = /a pesar de que alguien fuera de la cárcel que mira /path/to/jail/.., verá en su /path/tolugar.

Phil P
fuente
1
¿Cuántos programas dependen del "contrato" que /tiene ..ese punto en sí mismo? Creo que podría haber sido igualmente (o más) aceptable para /NO tener ...
musiphil
¿Alguien tiene una fuente que confirme esta teoría?
Julian Hollmann
1
Bueno, man 5 diren un sistema BSD lo guiará a través de la API documentada, y los elementos establecidos en la API son parte del contrato.
Phil P
1
find tiene una optimización que se basa en el contrato n + 2.
ctrl-alt-delor
2
Ah, y por supuesto, si desea una fuente , simplemente lea la especificación. POSIX en pubs.opengroup.org/onlinepubs/9699919799 en la sección 4.12: "El punto de nombre de archivo especial se referirá al directorio especificado por su predecesor. El nombre de archivo especial punto-punto se referirá al directorio padre de su directorio predecesor. Como especial caso, en el directorio raíz, punto-punto puede referirse al directorio raíz en sí ".
Phil P