Почему в «/» есть запись «..»?

81

Это всегда озадачивало меня. Почему корневой каталог содержит ссылку на родительский каталог?

Боб @ Боб: / $ 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 = количество подкаталогов в каталоге). Один для каждого непосредственного подкаталога, один для его родителя и один для себя.

Но каков /родитель?

Натан Осман
источник

Ответы:

73

/..указывает на /:

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

Оба имеют одинаковый номер инода, который в этой системе равен 2. (Точное значение не имеет значения.)

Это сделано для согласованности. Таким образом, в ядре не должно быть кода, чтобы проверить, где он находится в данный момент, когда обрабатывает a ..в пути. Вы можете сказать cd ..навсегда, и никогда не идти глубже, чем корень.

Уоррен Янг
источник
20
@ Джордж Я полагаю, что эксплойты, которые используют преимущества относительных путей, используют это; вам не нужно угадывать текущую папку, вы просто делаете../../../../../../../../../../../../../../../../etc/passwd
Майкл Мрозек
21
Какая разница с простым использованием / etc / passwd?
Jlliagre
9
@jlliagre: есть программы, которые проверяют, находится ли файл в текущем каталоге, проверяя, начинается ли он с /. Между ../(не обязательно в начале!) И символическими ссылками сделать это очень сложно, особенно учитывая, что злоумышленник может перемещать каталоги под нос программы.
Жиль
4
Я вижу, они должны по крайней мере использовать canonicalize_file_name или realpath.
Jlliagre
5
@musiphil: это хорошо. Майкл только что указал, что это функция, которую можно использовать для плохих целей, если код не написан, чтобы справиться с эксплойтом. Если бы мы избавились от всех функций, которые могут быть использованы, компьютеры были бы очень скучными вещами.
Уоррен Янг
38

Он существует потому, что это гарантия, предоставляемая Unix: каждый каталог содержит две записи, .которые ссылаются на себя и ..ссылаются на родителя.

Корневой каталог текущего пространства имен является особенным, поскольку он ..указывает на то же самое ., но не настолько особенный, чтобы нарушать гарантии, предоставляемые ОС программам. Когда эти контракты нарушаются, все идет не так, как надо, и все указывают пальцем.

Корневой каталог, который вы видите, может в файловой системе на диске фактически иметь другой родительский каталог. Представление файловых систем, представленных в смонтированном пространстве имен, - это то, для чего применяется .. = .правило /. Так что, если вы в chroot()тюрьме, вы увидите, /.. = /даже если кто-то за пределами тюрьмы /path/to/jail/..увидит /path/toвместо этого.

Фил П
источник
1
Сколько программ зависит от «контракта» , что /имеет , ..что указывает на себя? Я думаю, что это было бы одинаково (или более) приемлемо для /НЕ иметь ...
Musiphil
У кого-нибудь есть источник, подтверждающий эту теорию?
Джулиан Холлманн
1
Что ж, man 5 dirв системе BSD вы пройдете через документированный API, и элементы, указанные в API, являются частью контракта.
Фил П
1
find имеет оптимизацию, основанную на контракте n + 2.
Ctrl-Alt-Delor
2
О, и, конечно, если вам нужен источник, просто прочитайте спецификацию. POSIX на pubs.opengroup.org/onlinepubs/9699919799 в разделе 4.12: «Точка специального имени файла должна ссылаться на каталог, указанный его предшественником. Точка специального имени файла должна ссылаться на родительский каталог своего каталога предшественника. В качестве специального В этом случае точка-точка может указывать на сам корневой каталог. "
Фил П