【发布时间】:2017-08-27 04:56:34
【问题描述】:
如何通过只知道文件的 inode 在 Bash 中检索文件内容?
【问题讨论】:
标签: bash filesystems inode
如何通过只知道文件的 inode 在 Bash 中检索文件内容?
【问题讨论】:
标签: bash filesystems inode
您不能通过 inode 访问文件,因为这会破坏通过权限的访问控制。例如,如果您没有遍历目录的权限,那么无论文件的权限是什么,您都无法访问该目录中的任何文件。如果您可以通过 inode 访问文件,那将绕过目录权限。
有一些方法可以通过 inode 号获取文件的路径或名称,例如使用 find。获得文件路径后,您可以使用任何常规工具。
find 有一个 inum 参数来按 inode 查找文件。这是一个例子:
find -inum 1704744 -exec cat {} \;
这将打印带有 inode 1704744 的文件的内容,假设它位于当前目录或其子目录之一中。
注意:ls 也有一个 -i 选项来获取与文件关联的 inode。
【讨论】:
使用 ext2/ext3/ext4 文件系统获取 inode:
inode=262552
device=/dev/sda1
sudo debugfs -R "ncheck $inode" $device 2>/dev/null
输出(示例):
索引节点路径名 262552 /var/log/syslog显示文件内容:
sudo debugfs -R "ncheck $inode" $device 2>/dev/null | awk '/[1-9]/ {print $2}' | xargs cat
【讨论】:
cat 命令,它接受一个inode 编号并读取相应的文件内容:debugfs -D -R 'cat <8>' /dev/sda3。请参阅this answer 了解更多信息。
如果您可以使用find (GNU findutils) 访问find 并且不是 POSIX find,您可以使用它的-inum 选项,
-inum n
File has inode number n. It is normally easier to use the
-samefile test instead
只需将它与-exec 选项一起使用并使用cat 打开文件,
find . -inum 1346087 -exec cat {} \;
假设我的文件sample.txt 的inode 值为
ls -id sample.txt
1346087 sample.txt
【讨论】:
可移植但速度慢的方法是使用find -inum ...,获取给定inode 的文件名,然后在下一步使用找到的文件名。
如果您只需要文件的 content(按 inode 编号),则存在一些文件系统/操作系统特定的解决方案。
对于 macOS,它很简单:
inode=48747714
eval "$(stat -s "/Volumes/volume_name")"
cat /.vol/$st_dev/$inode
例如在 OS X 的 HFS 文件系统中存在伪目录/.vol,您可以使用它们的 inode 号来访问文件内容:
/.vol/device_id/inode_number
device_id 可从stat 中获得/Volumes 中给定的volume_name,(检查ls /Volumes)。
【讨论】: