Wie erstelle ich eine symbolische Verknüpfung ohne Verwendung von ln?

31

Ich habe einen kritischen symbolischen Link gelöscht libc.so.6. Ich habe die Datei, auf die es zeigen sollte, aber die grundlegenden Befehle wie lnoder wgetfunktionieren nicht mehr, weil der Link fehlt. Allerdings echofunktionieren auch andere Bash-Builtins.

Ich suche nach einer Möglichkeit, diesen symbolischen Link wiederherzustellen.

Sebas
quelle
1
@ Sebas, ich denke du meintest alle Bash-Builtins , nicht nur echo.
Cristian Ciupitu
@CristianCiupitu vielleicht, was ist das? catist deaktiviert ... eigentlich war alles.
Sebas
1
@Sebas, das catliegt daran, dass es sich um ein externes Programm handelt. Auf der Manualpage zu Bash Builtin Commands finden Sie Details zu den verfügbaren Optionen .
Cristian Ciupitu
3
Ich gehe davon aus, dass Sie GNU / Linux-basierte Systeme meinen, wenn Sie "Unix" sagen, da viele andere * nix-Systeme "Rettungs" -Versionen der Standarddienstprogramme haben, die nur für diese "Hoppla" -Momente statisch verknüpft sind.
Chris S
Hier denke ich, dass Chrooting die einzige Lösung wäre ...
Rubenvb

Antworten:

58

Wenn Sie ldconfig verwenden, wird der Symlink neu erstellt:

# 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

Ich habe es gerade getestet, wie Sie sehen.

Natxo Asenjo
quelle
4
Und bequemerweise ist / sbin / ldconfig statisch verknüpft. ldconfig ist in erster Linie für diese symbolischen Links verantwortlich.
Ätherfisch
16
Das ist nicht nur "praktisch", eine statisch verknüpfte Binärdatei ist so ziemlich eine notwendige Designkomponente des Tools, das Ihre dynamischen Bibliotheken verwaltet! Aber es ist das, was es zu einem idealen Werkzeug zur Behebung dieses Problems macht, und meiner Meinung nach der einzige "richtige" Weg. Bei der Frage handelt es sich hier nicht wirklich um einen gelöschten Symlink (99,999% davon können ohne Konsequenz gelöscht werden), sondern um "Ich habe den dynamischen Bibliotheksspeicher meines Systems zerstört". Machen Sie den Vorschlag von @ natxo: "Korrigieren Sie ihn mit dem Tool, das diesen Speicher verwaltet", offensichtlich und vernünftig. Alles andere (die Verknüpfung manuell neu erstellen) ist eine hackige Problemumgehung.
FeRD
Ja, dies ist in der Tat logischer, auch wenn die andere Antwort ebenfalls richtig war.
Sebas
(Nekromantie, sorry) Das Löschen von Symlinks ist übrigens nicht der einzige Grund, warum Sie Ihren dynamischen Bibliotheksspeicher kaputt machen können. Angenommen, Sie haben /lib/libc-2.12.soim obigen Beispiel versehentlich in umbenannt /lib/foobar. Nun, Mist, nicht mehr mv. Ist ldconfig -l /lib/foobaraber auch schlau genug, /lib/libc.so.6auf die falsch benannte Datei zu verweisen . (Die Argumente sind erforderlich. Standardmäßig werden ldconfigDateinamen ignoriert, die nicht mit "lib" beginnen und ".so" enthalten.) Zu welchem ​​Zeitpunkt können Sie mves zurücksetzen (oder cp -pwenn Sie paranoid / intelligent sind), und dann ldconfigerneut ausführen , um aufzuräumen .
FeRD
44

CentOS 6 wird im Allgemeinen mit busyboxeinem statisch verknüpften Satz von Unix-Tools geliefert, die in installiert sind /sbin. Sie können es so ausführen:

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6
Mark Plotnick
quelle
1
+1, habe es gerade getestet, nachdem der Symlink in einem Test-VM entfernt wurde. Es funktioniert in Centos 6.5
Natxo Asenjo,
+1 Hiermit wird auch die allgemeine Frage im Fragentitel beantwortet.
MattBianco
Unter Debian / Ubuntu ist es / bin / busybox
PHZ.fi-Pharazon
23

Stellen Sie LD_PRELOAD ein, um die relevante Bibliothek vorzuladen. Ich habe es mit libpthread ausprobiert und es scheint zu funktionieren:

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...
Dennis Kaarsemaker
quelle
Interessanterweise gruppiert es sich mit dem, was die anderen sagten.
Sebas
21

slndient genau diesem Zweck: um symbolische Links zu reparieren, wenn Sie reguläre ln nicht verwenden können, weil Sie einen wichtigen Symlink gebrochen haben. So zitieren Sie die Manpage:

BESCHREIBUNG

  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.
aru
quelle
schön, ich kannte dieses tool nicht. In Centos ist es Teil von glibc, daher muss es standardmäßig installiert werden
natxo asenjo
8

Sie können die LD_LIBRARY_PATHVariable so einstellen , dass sie das Verzeichnis enthält, in dem real libc.so.6ist:

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

Führen ldconfigSie dies auch aus, um die Links neu zu erstellen. Damit sollten die Befehle funktionieren, damit Sie sie verwenden könnenln Befehle können, um Ihr System zu reparieren.

Eine andere Möglichkeit wäre, über LiveCD zu booten und die Datei dort zu verlinken.

phoops
quelle
Dann nur noch weg von livecd booten und datei dort in chroot verlinken.
Phoops
1
Außerdem sollten Sie LD_LIBRARY_PATH so einstellen, dass es das Verzeichnis enthält, in dem sich die Datei libc.so.6 befindet. Dies kann dazu führen, dass Sie die Befehle so verwenden, wie es die Bibliothek finden sollte.
Phoops
verdammt, tut mir leid, ich habe zuerst nicht daran gedacht.
Phoops
2
Das funktioniert nicht, da die verknüpfte Datei nicht libc.so.6 heißt. Sie müssen LD_PRELOAD wie in meiner Antwort festlegen.
Dennis Kaarsemaker
1
Ich habe es auf Fedora 20 ausprobiert und es hat nicht funktioniert.
Cristian Ciupitu
-4

Verwenden Sie scp oder sftp, um eine statisch verknüpfte Version von ln zu kopieren. Stellen Sie sicher, dass es ausführbar ist. Verwenden Sie es dann, um die Datei zu reparieren.

Robert Jacobs
quelle
1
scp und sftp funktionieren nicht, da sie diese Datei auch nicht laden können.
Florin Asăvoaie
scp, sftp, ftp würde von einem entfernten Host ausgeführt. Dies setzt voraus, dass der Dämon auf dem kaputten Computer bereits ausgeführt wird. Andere Möglichkeiten für die Dateiübertragung sind Dateisysteme, die entweder lokal oder remote bereits eingehängt sind.
Robert Jacobs
3
Bitte hör auf Fehlinformationen. SCP erfordert das Vorhandensein der scp-Binärdatei und wird auf beiden Hosts ausgeführt. SFTP startet auch neue Prozesse aus OpenSSH, die die entsprechende Binärdatei erfordern. Die meisten FTP-Daemons tun dasselbe.
Florin Asăvoaie