为什么“ /”有一个“ ..”条目?


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媒体根srv var

我了解如何在文件系统中管理目录-每个目录都有n + 2个指向自身的指针(n =目录中子目录的数量)。每个直接子目录一个,其父目录一个,其自身一个。

但是,什么是/父母?

Answers:


73

/..指向/

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

两者都有相同的索引节点号,在此系统上恰好是2。(确切的值无关紧要。)

这样做是为了保持一致性。这样,内核在处理..路径中的a 时不必在代码中检查当前位置。您可以说cd ..永远,也不能说根深蒂固。


20
我相信@George会利用相对路径的漏洞利用;您不必猜测当前文件夹,您只需执行即可../../../../../../../../../../../../../../../../etc/passwd
Michael Mrozek

21
仅使用/ etc / passwd有什么区别?
jlliagre 2011年

9
@jlliagre:有些程序通过测试文件是否以开头来检查文件是否在当前目录下/。在../(不一定是开始!)和符号链接之间,这很难做到,尤其是考虑到攻击者可能会将目录移动到程序的鼻子下面。
吉尔斯

4
我知道,他们至少应该使用canonicalize_file_name或realpath。
jlliagre 2011年

5
@musiphil:这是一件好事。Michael只是指出,如果没有编写代码来应对漏洞利用,则该功能可被利用来达到不良目的。如果我们摆脱了所有可以利用的功能,计算机将变得非常乏味。
沃伦·杨

38

之所以在这里是因为它是Unix的保证:每个目录都包含两个条目,.这两个条目指的是自身,并且..指的是父目录。

当前名称空间的根目录是特殊的,因为它..指向与相同的东西.,但并不特殊,以破坏OS对程序的保证。当这些合同被打破时,事情就出错了,每个人都指责。

您看到的根目录可能在磁盘上的文件系统中实际上具有不同的父目录。装入的命名空间中提供的文件系统的视图将强制执行.. = .规则/。因此,即使您在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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.