24

为什么只知道文件的 inode 而不搜索链接到该 inode 的文件却无法访问该文件?文件的硬链接只包含一个名称和一个数字,告诉您在哪里可以找到包含有关文件的所有真实信息的 inode。当我被告知没有用户模式的方式可以直接使用 inode 号打开文件时,我感到很惊讶。

这似乎是系统提供的一种无害且有用的功能。为什么不提供?

4

5 回答 5

19

安全原因——要访问一个文件,您需要对该文件的权限以及从根目录搜索所有目录的权限,以获取该文件。如果您可以通过 inode 访问文件,则可以绕过对包含目录的检查。

这允许您创建一个可由一组用户(或一组组)而不是其他任何人访问的文件——创建只能由用户访问的目录(每个用户一个目录),然后硬-将文件链接到所有这些目录 - 任何人都可以访问文件本身,但实际上只能由对其链接到的目录之一具有搜索权限的人访问。

于 2011-01-05T17:09:15.270 回答
18

某些操作系统确实具有该功能。例如,OS X 需要它来支持Carbon 文件管理器,而在 Linux 上你可以使用debugfs. 当然,您可以通过命令行在任何 UNIX 上执行此操作find -inum,但您无法通过 inode 访问文件的真正原因是它不是特别有用。它确实绕过了文件权限,因为如果您可以在无法读取或执行的文件夹中读取文件,那么打开 inode 可以让您发现它。

它不是很有用的原因是您需要通过*stat()调用找到一个 inode 编号,此时您已经有了文件名(或打开的 fd)......或者您需要猜测 inum。

于 2011-01-05T17:19:50.410 回答
4

作为对您的评论的回应:要“传递文件”,您可以使用 fd 通过SCM_RIGHTS(参见参考资料man 7 unix)传递 AF_LOCAL 套接字。

于 2011-01-05T17:12:25.883 回答
4

Btrfs 确实有一个 ioctl(此补丁中添加了BTRFS_IOC_INO_PATHS ),但是它不会尝试检查路径上的权限,而只是保留给 root。

于 2012-09-30T16:31:28.563 回答
2

当然,如果您已经通过路径查找了文件,您不应该一次又一次地这样做吗?

stat(f,&s); i=open(f,O_MODE);

涉及通过目录结构进行的两次拖网。这会通过不必要的字符串操作浪费 CPU 周期。是的,精心设计的文件系统缓存将隐藏大部分这种低效率的临时最终用户,但是无缘无故地重复工作如果不是愚蠢的话,也是丑陋的。

于 2013-05-18T05:30:34.690 回答