如何在不使用ln的情况下创建符号链接?


31

我删除了关键符号链接- libc.so.6。我有应该指向的文件,但是由于缺少链接,基本命令(例如ln或)wget不再起作用。但是,echo或其他Bash内置函数起作用。

我正在寻找一种重新创建此符号链接的方法。


1
@Sebas,我想您是指所有Bash内置函数,而不仅仅是echo
Cristian Ciupitu 2014年

@CristianCiupitu也许是什么?cat被禁用...实际上是一切。
塞巴2014年

1
@Sebas,那是因为它cat是一个外部程序。“ Bash内置命令”手册页包含有关可用内容的详细信息。
克里斯蒂安·丘皮图

3
我假设您说的是“ Unix”时,您的意思是基于GNU / Linux的系统,因为许多其他* nix系统具有“救援”版本的标准实用程序,这些版本仅在那些“糟糕”时刻静态链接。
克里斯S

这是我在想,只有扎根是唯一的解决方案……
rubenvb 2014年

Answers:


58

您可以使用ldconfig,它会重新创建符号链接:

# rm /lib/libc.so.6 
rm: remove symbolic link `/lib/libc.so.6'? y
# ls -l /lib/libc*
ls: error while loading shared libraries: libc.so.6: cannot open shared object file:
# ldconfig 
# ls -l /lib/libc*
[skip]
lrwxrwxrwx. 1 root root      12 May 11 07:59 /lib/libc.so.6 -> libc-2.12.so

如您所见,它刚刚进行了测试。


4
而且,方便地,/ sbin / ldconfig是静态链接的。ldconfig首先负责那些符号链接。
etherfish 2014年

16
这不只是“方便”,静态链接的二进制文件是维护动态库的工具的必不可少的设计组件!但这是使其成为解决此问题的理想工具的方法,而恕我直言是唯一的“正确”方法。这里的问题实际上与删除的符号链接无关(可以删除99.999%的符号链接而不会造成任何后果),而是“我破坏了系统的动态库存储”。提出@natxo的建议“显而易见且明智”,“使用管理商店的工具对其进行修复”。其他任何方法(手动重新创建链接)都是一个棘手的解决方法。
FeRD 2014年

是的,这样做确实更合乎逻辑,因此即使其他答案也是正确的。
塞巴2014年

(对不起,对不起),顺便说一句,最重要的原因是删除符号链接不是您搞砸动态库存储的唯一方法。举例来说,假设您/lib/libc-2.12.so在上面的示例中不小心将其重命名为/lib/foobar。好吧,别胡闹了mv。但是,ldconfig -l /lib/foobar它甚至足够聪明,可以/lib/libc.so.6指向错误命名的文件。(必须使用args,默认情况下会ldconfig忽略不以“ lib”开头且包含“ .so”的文件名。)此时,您可以将mv其返回(或者cp -p如果您偏执狂/聪明),然后ldconfig再次运行以进行清理。
FeRD


23

设置LD_PRELOAD以预加载相关库。我用libpthread尝试了一下,它似乎可以工作:

root@spirit:~# mv /lib/x86_64-linux-gnu/libpthread.so.0 /lib/x86_64-linux-gnu/libpthread.so.0-bak
root@spirit:~# chattr
chattr: error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory
root@spirit:~# LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0-bak chattr
Usage: chattr [-RVf] [-+=AaCcDdeijsSu] [-v version] files...

有趣的是,它与其他人说的重新组合。
塞巴2014年

21

sln正是出于这个目的:在您无法使用常规ln时修复符号链接,因为您破坏了必要的符号链接。引用其手册页:

描述

  The  sln  program creates symbolic links.  Unlike the ln(1) program, it
  is statically linked.  This means that if for some reason  the  dynamic
  linker  is  not  working,  sln  can  be  used to make symbolic links to
  dynamic libraries.

很好,我不知道这个工具。在centos中,它是glibc的一部分,因此必须默认安装
natxo asenjo 2014年

8

您可以设置LD_LIBRARY_PATH变量以包含真实目录libc.so.6

 export LD_LIBRARY_PATH="/dir/for/libc.so.6/:$LD_LIBRARY_PATH"

另外,对其执行ldconfig以重新创建链接。这应该可以使命令正常工作,因此您可以使用ln命令来修复系统。

另一种方法是通过LiveCD引导并在那里链接文件。


然后是启动livecd并在chroot中链接文件的唯一方法。
2014年

1
另外,您应该只将LD_LIBRARY_PATH设置为包括libc.so.6文件所在的目录。这可能会让您使用命令,因为它应该找到库。
2014年

该死,对不起,我没有想到这个。
2014年

2
这不起作用,因为链接到的文件未命名为libc.so.6。您需要将LD_PRELOAD设置为我的答案。
丹尼斯·考斯玛克

1
我在Fedora 20上尝试过,但是没有用。
Cristian Ciupitu 2014年

-4

使用scp或sftp复制静态链接的ln版本。确保它是可执行的。然后使用它来修复文件。


1
scp和sftp将不起作用,因为它们也将无法加载该文件。
FlorinAsăvoaie2014年

scp,sftp,ftp将从远程主机运行。这假定损坏的计算机中的守护程序已在运行。文件传输的其他可能性是已经安装的本地或远程文件系统。
罗伯特·雅各布斯

3
请停止提供错误信息。SCP要求存在scp二进制文件,并将在两个主机上执行。SFTP还从OpenSSH启动需要相应二进制文件的新进程。大多数FTP守护程序都执行相同的操作。
FlorinAsăvoaie2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.