![如何在Linux中有效跟踪硬链接?](https://linux22.com/image/179515/%E5%A6%82%E4%BD%95%E5%9C%A8Linux%E4%B8%AD%E6%9C%89%E6%95%88%E8%B7%9F%E8%B8%AA%E7%A1%AC%E9%93%BE%E6%8E%A5%EF%BC%9F.png)
软链接很容易追踪到原始文件readlink
等...但我很难追踪到原始文件的硬链接。
$ ll -i /usr/bin/bash /bin/bash
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash*
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /usr/bin/bash*
^
上面的内容符合预期 - 很酷 - >两个文件都指向相同的 inode 1310813
(但是由 表示的链接数量^
显示为 1。从 Gilles 的回答中可以理解其原因)
$ find / -samefile /bin/bash 2>/dev/null
/usr/bin/bash
上面是预期的 - 所以没有问题。
$ find / -samefile /usr/bin/bash 2>/dev/null
/usr/bin/bash
上面是不是凉爽的。如何追踪原始文件或每个硬链接使用该/usr/bin/bash
文件作为参考?
奇怪 - 下面也没有帮助。
$ find / -inum 1310813 2>/dev/null
/usr/bin/bash
答案1
首先,硬链接的情况下没有原始文件;所有硬链接都是平等的。
ls -l
但是,这里不涉及硬链接,如输出中的链接计数 1 所示:
$ ll -i /usr/bin/bash /bin/bash 1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash* 1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /usr/bin/bash*
您的问题是由于符号链接而出现的,该bin
符号链接指向usr/bin
.寻找bash
所有可用的路径,您需要find
使用以下选项告诉遵循符号链接-L
:
$ find -L / -xdev -samefile /usr/bin/bash 2>/dev/null
/usr/bin/rbash
/usr/bin/bash
/bin/rbash
/bin/bash
我在这里使用是-xdev
因为我知道您的系统安装在单个文件系统上;这可以避免陷入/dev
、/proc
、等/run
。/sys
答案2
如何使用 /usr/bin/bash 文件作为参考来跟踪原始文件或每个硬链接
find
使用 GNU find (或具有该选项的任何其他版本-samefile
),并假设/usr/bin/bash
位于/
文件系统上,这是正确的:
find / -xdev -samefile /bin/bash
使用-xdev
硬链接是因为硬链接不能跨越文件系统边界。不要重定向错误:如果您没有权限遍历目录,则该目录下可能存在硬链接,您会错过它。
您所犯的错误是您正在寻找另一个不存在的硬链接。您实际上拥有知道它不存在的信息:
1310813 -rwxr-xr-x 1 root root 1183448 Jun 18 21:14 /bin/bash*
^
的硬链接计数为/bin/bash
1。
有一个文件,/
其中与/usr/bin/bash
.该文件/bin/bash
与/usr/bin/bash
由于不同的原因目录 /bin
和/usr/bin
是同一个文件。由于find / -samefile /bin/bash
指向/usr/bin/bash
,因此/bin
具有到 的符号链接/usr/bin
。更准确地说,根据问题中的信息,并假设这/bin
不是目录硬链接(支持不良、很少使用的功能),我们知道这/bin
是一个解析为的符号链接/usr/bin
;它可能是指向另一个符号链接的符号链接,依此类推,最终解析为/usr/bin
某个等效路径,例如///////usr/bin/
,但很可能它是一个目标为 的符号链接/usr/bin
。
查找整个系统上某个文件的所有符号链接并不是特别有效。例如,在 Linux 上,有一个文件是每个正在运行 bash 的进程的/proc/*/exe
符号链接/usr/bin/bash
(或)。/bin/bash
如果您查找目录的符号链接,您最终将陷入无限递归,例如指向/proc/*/root
(/
除了 chrooted 进程)。
如果您需要知道两个路径是否指向同一个文件,在 Linux 上,您可以使用以下任一方法
[ /bin/bash -ef /usr/bin/bash ]
test /bin/bash -ef /usr/bin/bash
(-ef
不是 POSIX,但它在 dash、bash、BusyBox 和 GNU coreutils 中)。如果您需要获取文件的规范路径,从某种意义上说,不同的文件始终具有不同的规范名称,您可以使用
readlink -f /bin/bash
(这可能会丢失通过挂载目录相等的文件,例如,如果以两种不同的方式挂载相同的网络位置。)