【问题标题】:Open file by inode通过inode打开文件
【发布时间】:2016-07-05 16:34:19
【问题描述】:

是否可以在知道其 inode 的情况下打开文件?

ls -i /tmp/test/test.txt
529965 /tmp/test/test.txt

我可以提供路径、inode(529965 以上),我希望得到一个文件描述符作为回报。

【问题讨论】:

标签: linux filesystems stdio


【解决方案1】:

这是不可能的,因为它会在访问控制规则中打开一个漏洞。是否可以打开文件不仅取决于它自己的 访问权限位,还取决于每个包含目录的权限位。 (例如,在您的示例中,如果 test.txt 是模式 644,但包含目录 test 是模式 700,则只有 root 和 test 的所有者可以打开 test.txt。)inode 编号仅标识文件,而不是包含的目录(一个文件可能位于多个目录中;请阅读“硬链接”),因此内核无法仅使用一个 inode 号执行一整套访问控制检查。

(一些 Unix 实现提供了非标准的 root-only API 来通过 inode 号打开文件,绕过了一些访问控制规则,但如果当前的 Linux 有这样的 API,我不知道。)

【讨论】:

    【解决方案2】:

    不完全是您要问的,但是(如 zwol 所暗示的)Linux 和 NetBSD/FreeBSD 都提供了使用以前创建的“句柄”打开文件的能力:这些是类似 inode 的持久名称,用于标识文件一个文件系统。

    在 *BSD(getfh 和 fhopen)上使用它很简单:

    #include <sys/param.h>
    #include <sys/mount.h>
    
    
    fhandle_t file_handle;
    getfh("<file_path>", &file_handle);  // Or `getfhat` for the *at-style API
    
    // … possibly save handle as bytes somewhere and recreate it some time later …
    
    int fd = fhopen(&file_handle, O_RDWR);
    

    然而,最后一次调用要求调用者是 root。

    Linux 的name_to_handle_at 和open_by_handle_at 系统调用很相似,但是更加明确,并且要求调用者自己跟踪相关的文件系统挂载ID/UUID,所以我将谦虚地链接到@987654326 @ 反而。请注意,如果您希望在重新启动后保留句柄,则该示例不完整;必须将接收到的挂载 ID 转换为持久的文件系统标识符,例如文件系统 UUID,然后再将其转换回挂载 ID。然而,本质上他们做同样的事情。就像在 *BSD 上使用后面的系统调用一样需要提升的权限(确切地说是CAP_DAC_READ_SEARCH)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 2011-05-21
      • 2016-04-26
      • 2016-09-18
      • 2015-05-31
      • 2012-03-22
      • 2011-06-28
      相关资源
      最近更新 更多