有没有办法查看符号链接的实际内容?
Posted
技术标签:
【中文标题】有没有办法查看符号链接的实际内容?【英文标题】:is there a way to see the actual contents of a symlink? 【发布时间】:2011-06-02 03:35:13 【问题描述】:当你这样做时
cat some-symlink-to-some-real-file
它显示的是真实文件的内容,而不是符号链接本身的内容。有没有办法查看其中的实际内容?
【问题讨论】:
你想用什么编程语言来做这个? 底层系统调用是readlink(2)
。如其中一个答案所述,在某些系统(GNU 和相关系统)上使用的直接命令是readlink(1)
。在其他系统上——HP-UX、Solaris、AIX——最接近的方法可能是ls -l
,但如果链接中的路径名包含换行符或其他奇怪的字符,请注意问题。
【参考方案1】:
试试
find . -type l -exec ls -la \;
【讨论】:
此命令将查找从当前目录开始的所有链接。本质上是ls -l,负责显示每一个的内容。【参考方案2】:ls -l
命令会告诉你:
$ ls -l foo
lrwxrwxrwx 1 user group 11 2010-12-31 19:49 foo -> /etc/passwd
或者readlink
command:
$ readlink foo
/etc/passwd
所以,符号链接foo
指向路径/etc/passwd
。
【讨论】:
为了更清楚一点,符号链接的“内容”也不过是它所指向的名称。 @Ben:嗯,shell是右手的编程语言,所以区别并不完全清楚。 @ijw:确实如此。但是,我们不必为了确定这不是程序员方面的问题而准确地确定那条线。此外,这些甚至都不是 shell 命令,ls
和 readlink
都是独立的应用程序。
@Ben:再一次,嗯。脚本中的大多数行都运行单独的程序,这就是 Unix 的本质。这条线是一条宽阔而灰色的线。不过,他似乎有理由将它用于脚本而不是在命令行上使用,这类似于其他语言中的“什么是执行 xxx 的库函数”问题。
@CMCDragonkai 硬链接本身没有内容。它只是指向一个inode。您可以使用stat
或ls -di
获取inode。【参考方案3】:
您可以调用readlink(2)
函数,它将链接到的名称放入缓冲区。
请注意,结果有一个长度(存储在返回值中)而不是 NUL 终止。所以如果你想把它当作一个字符串来使用,你自己附加一个 NUL。
大多数高级/脚本语言,例如 perl 或 python,将提供一个 readlink 包装器,该包装器可以转换为通常的语言适当的字符串类型,因此您不会被诸如 NUL 终止之类的细节所困扰。
【讨论】:
【参考方案4】:关于手册页http://man7.org/linux/man-pages/man7/symlink.7.html 符号链接是常规文件(带有特殊标志),其内容中包含目标路径。所以你可以将符号链接复制到 FAT 分区并在那里读取它的内容。
【讨论】:
以上是关于有没有办法查看符号链接的实际内容?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法从 ELF 中提取符号,并使用 LD 将另一个文件与之前 ELF 中定义的符号链接在一起?