Это всегда озадачивало меня. Почему корневой каталог содержит ссылку на родительский каталог?
Боб @ Боб: / $ ls -a , построить дом lib32 mnt .rpmdb sys vmlinuz .. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old bin dev initrd.img.old lost + found proc selinux usr загрузка и т. д. lib media root srv var
Я понимаю, как каталоги управляются в файловой системе - каждый каталог имеет n + 2 указателей на себя (n = количество подкаталогов в каталоге). Один для каждого непосредственного подкаталога, один для его родителя и один для себя.
Но каков /
родитель?
filesystems
directory
directory-structure
Натан Осман
источник
источник
../../../../../../../../../../../../../../../../etc/passwd
/
. Между../
(не обязательно в начале!) И символическими ссылками сделать это очень сложно, особенно учитывая, что злоумышленник может перемещать каталоги под нос программы.Он существует потому, что это гарантия, предоставляемая Unix: каждый каталог содержит две записи,
.
которые ссылаются на себя и..
ссылаются на родителя.Корневой каталог текущего пространства имен является особенным, поскольку он
..
указывает на то же самое.
, но не настолько особенный, чтобы нарушать гарантии, предоставляемые ОС программам. Когда эти контракты нарушаются, все идет не так, как надо, и все указывают пальцем.Корневой каталог, который вы видите, может в файловой системе на диске фактически иметь другой родительский каталог. Представление файловых систем, представленных в смонтированном пространстве имен, - это то, для чего применяется
.. = .
правило/
. Так что, если вы вchroot()
тюрьме, вы увидите,/.. = /
даже если кто-то за пределами тюрьмы/path/to/jail/..
увидит/path/to
вместо этого.источник
/
имеет ,..
что указывает на себя? Я думаю, что это было бы одинаково (или более) приемлемо для/
НЕ иметь..
.man 5 dir
в системе BSD вы пройдете через документированный API, и элементы, указанные в API, являются частью контракта.