Чому "/" має запис ".."?


81

Це мене завжди спантеличувало. Чому кореневий каталог містить посилання на батьківський каталог?

bob @ bob: / $ ls -a
. побудувати домашній lib32 mnt .rpmdb sys vmlinuz
.. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old
bin dev initrd.img.old втрачено + знайдено proc selinux usr
завантаження і т.д. lib media root srv var

Я розумію, як керуються каталогами у файловій системі - кожен каталог має n + 2 покажчиків на себе (n = кількість підкаталогів всередині каталогу). Один для кожного безпосереднього підкаталогу, один для свого батьківського і один для себе.

Але що /з батьком?

Відповіді:


73

/..вказує на /:

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

Обидва мають однаковий номер inode, який, як виявляється, є 2 у цій системі. (Точне значення не має значення.)

Це робиться для консистенції. Таким чином, у ядрі не повинно бути коду, щоб перевірити, де воно зараз знаходиться, коли воно обробляє ..шлях. Можна сказати cd ..назавжди, і ніколи не заглиблюйся корінь.


20
@George Я вважаю, що експлуатують корисні відносні шляхи; вам не доведеться вгадувати поточну папку, ви просто зробите../../../../../../../../../../../../../../../../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, є частиною договору.
Phil P

1
find має оптимізацію, яка спирається на договір n + 2.
ctrl-alt-delor

2
О, і, звичайно, якщо ви хочете джерело, тоді просто перейдіть, прочитайте специфікацію. POSIX за адресою pubs.opengroup.org/onlinepubs/9699919799 у розділі 4.12: "Спеціальна крапка з іменем файлу посилається на каталог, визначений його попередником. Спеціальна назва файлу точка-точка повинна посилатися на батьківський каталог попереднього каталогу. Як спеціальне у кореневому каталозі крапка-точка може посилатися на саму кореневу директорію. "
Phil P
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.