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

Nat*_*man 84 filesystems directory directory-structure

这一直困扰着我。为什么根目录包含对父目录的引用?

bob@bob:/$ ls -a
. 构建 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
引导等 lib 媒体根 srv var

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

但是什么是/父母?

War*_*ung 73

/..指向/

$ ls -id /
2 /
$ ls -id /..
2 /..
Run Code Online (Sandbox Code Playgroud)

两者都有相同的 inode 编号,在这个系统上恰好是 2。(确切的值并不重要。)

这样做是为了一致性。这样,当内核处理..路径中的 a时,内核中不必有代码来检查它当前的位置。你可以说cd ..永远,永远不要比根更深。

  • 简单地使用 /etc/passwd 会有什么区别? (24认同)
  • @George 我相信利用相对路径的漏洞会使用它;你不必猜测当前文件夹,你只需要做`../../../../../../../../../../../.. /../../../../etc/passwd` (22认同)
  • @jlliagre:有些程序通过测试文件是否以`/`开头来检查文件是否在当前目录下。在`../`(不一定在开头!)和符号链接之间,很难做到,特别是考虑到攻击者可能正在程序的鼻子下移动目录。 (11认同)
  • @musiphil:这是一件好事。Michael 只是指出,如果不编写代码来应对漏洞利用,那么它是一个可以被利用以达到不良目的的功能。如果我们去掉所有可以利用的功能,计算机将是非常乏味的东西。 (5认同)
  • 我明白了,他们至少应该使用 canonicalize_file_name 或 realpath。 (4认同)
  • 正如我在回答中所写,它使系统保持一致。没有特殊情况。此外,作为一项规则,Unix 不会对用户进行二次猜测。如果系统有一种合理的方式来遵守命令,它就会这样做。另一种选择是一个系统总是告诉你“不”,或者问“你真的确定吗?” (2认同)

Phi*_*l P 39

它在那里是因为它是 Unix 的保证:每个目录都包含两个条目,.一个指向它自己,..另一个指向父目录。

当前命名空间的根目录比较特殊,与..指向同一个东西.,但又不那么特殊,破坏了操作系统对程序的保证。当这些合同被打破时,事情就会出错,每个人都指责。

您看到的根目录,在磁盘文件系统中,实际上可能有一个不同的父目录。在所提供的文件系统的视图安装命名空间是什么强制执行.. = .的规则/。所以如果你在chroot()监狱里,你会看到,/.. = /即使监狱外的人/path/to/jail/..会看到/path/to

  • find 有一个依赖于 n+2 契约的优化。 (2认同)
  • 哦,当然,如果你想要一个 _source_ 那就去阅读规范吧。POSIX 在 http://pubs.opengroup.org/onlinepubs/9699919799/ 的第 4.12 节中:“特殊文件名 dot 应指其前任指定的目录。特殊文件名 dot-dot 应指其前任的父目录目录。作为一种特殊情况,在根目录中,点点可能指的是根目录本身。” (2认同)