Zawsze mnie to intrygowało. Dlaczego katalog główny zawiera odniesienie do katalogu nadrzędnego?
bob @ bob: / $ ls -a . build home lib32 mnt .rpmdb sys vmlinuz .. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old bin dev initrd.img.old lost + found proc selinux usr boot itp. lib media root srv var
Rozumiem, w jaki sposób katalogi są zarządzane w systemie plików - każdy katalog ma n + 2 wskaźniki do siebie (n = liczba podkatalogów w katalogu). Jeden dla każdego bezpośredniego podkatalogu, jeden dla jego rodzica i jeden dla siebie.
Ale czym jest /
rodzic?
filesystems
directory
directory-structure
Nathan Osman
źródło
źródło
../../../../../../../../../../../../../../../../etc/passwd
/
. Pomiędzy../
(niekoniecznie na początku!) A dowiązaniami symbolicznymi jest to bardzo trudne, szczególnie biorąc pod uwagę, że atakujący może przenosić katalogi pod nosem programu.Jest tam, ponieważ jest to gwarancja udzielona przez Unix: każdy katalog zawiera dwa wpisy,
.
które odnoszą się do siebie i..
do elementu nadrzędnego.Katalog główny bieżącej przestrzeni nazw jest wyjątkowy, pod tym
..
samym względem.
, że nie jest tak wyjątkowy, aby złamać gwarancję, jaką system operacyjny zapewnia programom. Gdy te umowy zostaną zerwane, wszystko idzie nie tak i wszyscy wskazują palcami.Katalog główny, który widzisz, w systemie plików na dysku może mieć inny katalog nadrzędny. Widok systemów plików zawartych w zamontowanej przestrzeni nazw jest tym, co wymusza
.. = .
regułę/
. Więc jeśli jesteś wchroot()
więzieniu, zobaczysz,/.. = /
nawet jeśli ktoś spoza więzienia patrzy na/path/to/jail/..
to/path/to
.źródło
/
ma..
to do siebie? Myślę, że mogłoby być równie (lub więcej) akceptowalne dla/
NIE..
.man 5 dir
w systemie BSD przeprowadzi Cię przez udokumentowane API, a elementy wymienione w API są częścią umowy.