为什么在只知道其inode时无法访问文件而不搜索链接到该inode的文件?该文件的硬链接只包含一个名称和一个数字,告诉您在哪里可以找到包含该文件的所有真实信息的inode。当我被告知没有用户模式直接使用inode号来打开文件时,我感到很惊讶。
这似乎是系统提供的这种无害且有用的功能。为什么没有提供?
答案 0 :(得分:17)
安全原因 - 访问文件您需要文件的权限AS WELL AS权限从根目录搜索所需的所有目录以获取文件。如果您可以通过inode访问文件,则可以绕过对包含目录的检查。
这允许您创建一个可由一组用户(或一组组)访问的文件而不是其他任何人 - 创建只能由用户访问的目录(每个用户一个目录),以及然后将文件硬链接到所有这些目录中 - 文件本身可由任何人访问,但实际上只能由对其链接的目录之一具有搜索权限的人访问。
答案 1 :(得分:16)
某些操作系统做具有该功能。例如,OS X需要它来支持Carbon File Manager,而在Linux上,您可以使用debugfs
。当然,您可以通过find -inum
从命令行在任何UNIX上执行此操作,但是您无法通过inode访问文件的真正原因是它不是特别有用。 有点绕过文件权限,因为如果有一个文件可以读取你无法读取或执行的文件夹,那么打开inode可以让你发现它。
它不是很有用的原因是你需要通过*stat()
调用找到一个inode号码,此时你已经拥有文件名(或一个开放的fd) ......或者你需要猜测内容。
答案 2 :(得分:4)
回复您的评论:要“传递文件”,您可以通过SCM_RIGHTS
使用fd传递AF_LOCAL套接字(请参阅man 7 unix
)。
答案 3 :(得分:3)
Btrfs确实有一个ioctl(BTRFS_IOC_INO_PATHS added in this patch),但它没有尝试检查路径上的权限,只是保留给root。
答案 4 :(得分:2)
当然,如果您已经通过路径查找了文件,那么您不应该一次又一次地执行此操作吗?
stat(f,&s); i=open(f,O_MODE);
涉及通过目录结构的两次拖网。这会浪费CPU周期和不必要的字符串操作。是的,精心设计的fs缓存会从一个随意的最终用户中隐藏大部分这种低效率,但如果不是愚蠢的话,无缘无故重复工作是丑陋的。