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?
filesystems
directory
directory-structure
Nathan Osman
fonte
fonte
../../../../../../../../../../../../../../../../etc/passwd
/
. 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.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 umachroot()
prisão, verá/.. = /
mesmo que alguém de fora da cadeia/path/to/jail/..
o veja/path/to
.fonte
/
possui..
esse ponto? Eu acho que poderia ter sido igualmente (ou mais) aceitável para/
NÃO ter..
.man 5 dir
em um sistema BSD, você será guiado pela API documentada, e os itens declarados na API fazem parte do contrato.