Dlaczego „/” ma wpis „..”?


81

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?

Odpowiedzi:


73

/..wskazuje na /:

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

Oba mają ten sam numer i-węzła, który w tym systemie wynosi 2. (Dokładna wartość nie ma znaczenia.)

Zrobiono to dla zachowania spójności. W ten sposób w jądrze nie musi być kodu, aby sprawdzić, gdzie się aktualnie znajduje, gdy przetwarza ..ścieżkę. Możesz mówić cd ..wiecznie i nigdy nie sięgać głębiej niż root.


20
@George Uważam, że wykorzystują to exploity wykorzystujące ścieżki względne; nie musisz zgadywać bieżącego folderu, po prostu to robisz../../../../../../../../../../../../../../../../etc/passwd
Michael Mrozek

21
Jaką różnicę to zrobiłoby po prostu używając / etc / passwd?
jlliagre 12.01.11

9
@jlliagre: Istnieją programy, które sprawdzają, czy plik znajduje się w bieżącym katalogu, sprawdzając, czy zaczyna się on /. 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.
Gilles,

4
Rozumiem, powinni przynajmniej użyć canonicalize_file_name lub realpath.
jlliagre 12.01.11

5
@musiphil: To dobra rzecz. Michael tylko wskazał, że jest to funkcja, którą można wykorzystać do złych celów, jeśli kod nie zostanie napisany, aby poradzić sobie z exploitem. Gdybyśmy pozbyli się wszystkich funkcji, które można wykorzystać, komputery byłyby bardzo nudne.
Warren Young,

38

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ś w chroot()więzieniu, zobaczysz, /.. = /nawet jeśli ktoś spoza więzienia patrzy na /path/to/jail/..to /path/to.


1
Ile programów zależy od „kontraktu”, który /ma ..to do siebie? Myślę, że mogłoby być równie (lub więcej) akceptowalne dla /NIE ...
musiphil

Czy ktoś ma źródło, które potwierdza tę teorię?
Julian Hollmann

1
Cóż, man 5 dirw systemie BSD przeprowadzi Cię przez udokumentowane API, a elementy wymienione w API są częścią umowy.
Phil P

1
find ma optymalizację opartą na kontrakcie n + 2.
ctrl-alt-delor

2
Aha, i oczywiście, jeśli chcesz źródła, po prostu przeczytaj specyfikację. POSIX na pubs.opengroup.org/onlinepubs/9699919799 w sekcji 4.12: „Kropka w specjalnej nazwie pliku powinna odnosić się do katalogu określonego przez swojego poprzednika. Kropka w specjalnej nazwie pliku odnosi się do katalogu nadrzędnego swojego poprzednika. W przypadku katalogu głównego kropka-kropka może odnosić się do samego katalogu głównego. ”
Phil P
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.