Por que '/' tem uma entrada '..'?


81

Isso sempre me intrigou. Por que o diretório raiz contém uma referência a um diretório pai?

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

Entendo como os diretórios são gerenciados no sistema de arquivos - cada diretório possui n + 2 ponteiros para si mesmo (n = número de subdiretórios dentro do diretório). Um para cada subdiretório imediato, um para seu pai e um para si.

Mas qual é /o pai?

Respostas:


73

/..aponta para /:

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

Ambos têm o mesmo número de inode, que é 2 neste sistema. (O valor exato não importa.)

É feito para consistência. Dessa forma, não precisa haver código no kernel para verificar onde está atualmente quando processa a ..em um caminho. Você pode dizer cd ..para sempre e nunca ir mais fundo do que a raiz.


20
@ George Eu acredito que explorações que tiram vantagem de caminhos relativos usam isso; você não precisa adivinhar a pasta atual, basta fazer isso../../../../../../../../../../../../../../../../etc/passwd
Michael Mrozek

21
Que diferença isso faria com o simples uso de / etc / passwd?
Jlliagre

9
@ jlliagre: Existem programas que verificam se um arquivo está no diretório atual, testando se ele começa com /. Entre ../(não necessariamente no começo!) E links simbólicos, é muito difícil, especialmente considerando que o invasor pode estar movendo diretórios sob o nariz do programa.
Gilles

4
Entendo, eles deveriam pelo menos usar canonicalize_file_name ou realpath.
Jlliagre

5
@musiphil: É uma coisa boa. Michael estava apenas apontando que é um recurso que pode ser explorado para fins ruins, se o código não for escrito para lidar com a exploração. Se nos livramos de todos os recursos que podem ser explorados, os computadores seriam coisas muito monótonas.
perfil completo de Warren Young

38

Está lá porque é uma garantia feita pelo Unix: todo diretório contém duas entradas, .que se referem a si mesmas e ..que se referem ao pai.

O diretório raiz do espaço para nome atual é especial, pois ..indica a mesma coisa que ., mas não tão especial, para quebrar a garantia feita pelo sistema operacional aos programas. Quando esses contratos são quebrados, as coisas dão errado e todo mundo aponta os dedos.

O diretório raiz que você vê pode, no sistema de arquivos em disco, realmente ter um diretório pai diferente. A visualização dos sistemas de arquivos fornecidos no espaço para nome montado é o que impõe a .. = .regra /. Portanto, se você estiver em uma chroot()prisão, verá /.. = /mesmo que alguém de fora da cadeia /path/to/jail/..o veja /path/to.


1
Quantos programas dependem do "contrato" que /possui ..esse ponto? Eu acho que poderia ter sido igualmente (ou mais) aceitável para /NÃO ter ...
musiphil

Alguém tem uma fonte que confirme essa teoria?
Julian Hollmann

1
Bem, man 5 direm um sistema BSD, você será guiado pela API documentada, e os itens declarados na API fazem parte do contrato.
Phil P

1
O find tem uma otimização que depende do contrato n + 2.
ctrl-alt-Delor

2
Ah, e claro, se você quiser uma fonte , basta ler a especificação. POSIX em pubs.opengroup.org/onlinepubs/9699919799 na seção 4.12: "O nome do arquivo especial ponto deve se referir ao diretório especificado por seu antecessor. O nome do arquivo especial ponto-ponto deve se referir ao diretório pai do diretório anterior. Como um especial caso, no diretório raiz, ponto-ponto pode se referir ao próprio diretório raiz ".
Phil P
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.