Comment créer un lien symbolique sans utiliser ln?

31

J'ai supprimé un lien symbolique critique - libc.so.6. J'ai le fichier vers lequel il doit pointer, mais les commandes de base telles que lnou wgetne fonctionneront plus en raison du lien manquant. Cependant, echoou d'autres fonctions intégrées de Bash fonctionnent.

Je cherche un moyen de recréer ce lien symbolique.

Sebas
la source
1
@Sebas, je pense que vous vouliez dire toutes les fonctionnalités de Bash , pas seulement echo.
Cristian Ciupitu
@CristianCiupitu peut-être, qu'est-ce que c'est? catest désactivé ... en fait, tout était.
Sebas
1
@Sebas, c'est parce que catc'est un programme externe. La page de manuel Bash Builtin Commands contient des détails sur ce qui pourrait être disponible.
Cristian Ciupitu
3
Je suppose que vous parlez de systèmes basés sur GNU / Linux lorsque vous dites "Unix" car de nombreux autres systèmes * nix ont des versions "de secours" des utilitaires standard qui sont liés statiquement juste pour ces moments "oups".
Chris S
Voici que je pense que chrooter serait la seule solution ...
rubenvb

Réponses:

58

vous pouvez utiliser ldconfig, il recrée le lien symbolique:

# 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

venez de le tester, comme vous le voyez.

natxo asenjo
la source
4
Et, commodément, le / sbin / ldconfig est lié statiquement. ldconfig est responsable de ces liens symboliques en premier lieu.
etherfish
16
Ce n'est pas vraiment "pratique", un binaire lié statiquement est à peu près un composant de conception nécessaire de l'outil qui maintient vos bibliothèques dynamiques! Mais c'est ce qui en fait un outil idéal pour résoudre ce problème, et à mon humble avis la seule façon "correcte". La question ici ne concerne vraiment pas un lien symbolique supprimé (99,999% de ceux-ci peuvent être supprimés sans conséquence), c'est "J'ai cassé le magasin de bibliothèque dynamique de mon système". Faire la suggestion de @ natxo, "le réparer en utilisant l'outil qui gère ce magasin", évident et sensé. Tout le reste (recréer manuellement le lien) est une solution de contournement hacky.
FeRD
Oui, il est en effet plus logique de procéder ainsi, même si l'autre réponse était également correcte.
Sebas
(nécromancie, désolé) La plus grande raison pour laquelle cela importe, BTW, est que la suppression des liens symboliques n'est pas la seule façon de visser votre magasin de bibliothèque dynamique. Supposons, par exemple, que vous ayez renommé accidentellement /lib/libc-2.12.sodans l'exemple ci-dessus en /lib/foobar. Eh bien, merde, pas plus mv. Mais il ldconfig -l /lib/foobarest même assez intelligent pour /lib/libc.so.6indiquer le fichier mal nommé . (Les arguments sont obligatoires, la valeur par défaut ldconfigignore les noms de fichiers qui ne commencent pas par "lib" et contiennent ".so".) À quel moment vous pouvez mvle récupérer (ou cp -psi vous êtes paranoïaque / intelligent), puis exécutez à ldconfignouveau pour nettoyer .
FeRD
44

CentOS 6 est généralement livré avec busyboxun ensemble d'outils Unix liés statiquement, installé dans /sbin. Vous pouvez l'exécuter comme ceci:

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6
Mark Plotnick
la source
1
+1, vient de le tester après avoir supprimé le lien symbolique dans un test vm, il fonctionne dans centos 6.5
natxo asenjo
+1 Cela répond également à la question générique dans le titre de la question.
MattBianco
Sur Debian / Ubuntu, c'est / bin / busybox
PHZ.fi-Pharazon
23

Définissez LD_PRELOAD pour précharger la bibliothèque appropriée. Je l'ai essayé avec libpthread et cela semble fonctionner:

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
la source
intéressant, il regroupe ce que les autres ont dit.
Sebas
21

slnsert exactement ce but: réparer les liens symboliques lorsque vous ne pouvez pas utiliser ln normal parce que vous avez cassé un lien symbolique essentiel. Pour citer sa page de manuel:

LA DESCRIPTION

  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
la source
sympa, je ne connaissais pas cet outil. Dans centos, il fait partie de la glibc, il doit donc être installé par défaut
natxo asenjo
8

Vous pouvez définir une LD_LIBRARY_PATHvariable pour inclure le répertoire où réel libc.so.6est:

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

Exécutez-le également ldconfigpour recréer les liens. Cela devrait faire fonctionner les commandes afin que vous puissiez ensuite utiliser les lncommandes pour réparer votre système.

Une autre façon serait de démarrer via LiveCD et de lier le fichier là-bas.

phoops
la source
Ensuite, seul moyen de démarrer livecd et de lier le fichier là-bas en chroot.
phoops
1
En outre, vous devez simplement définir LD_LIBRARY_PATH pour inclure le répertoire où se trouve le fichier libc.so.6. Cela pourrait vous permettre d'utiliser les commandes comme il devrait trouver la lib.
phoops
sacrément désolé, je n'y ai pas pensé en premier.
phoops
2
Cela ne fonctionne pas, car le fichier lié à n'est pas nommé libc.so.6. Vous devrez définir LD_PRELOAD comme dans ma réponse.
Dennis Kaarsemaker
1
Je l'ai essayé sur Fedora 20 et cela n'a pas fonctionné.
Cristian Ciupitu
-4

Utilisez scp ou sftp pour copier une version liée statiquement de ln. Assurez-vous qu'il est exécutable. Ensuite, utilisez-le pour corriger le fichier.

Robert Jacobs
la source
1
scp et sftp ne fonctionneront pas car ils ne pourront pas non plus charger ce fichier.
Florin Asăvoaie
scp, sftp, ftp seraient exécutés à partir d'un hôte distant. Cela suppose que le démon de la machine endommagée est déjà en cours d'exécution. D'autres possibilités de transfert de fichiers sont des systèmes de fichiers déjà montés, locaux ou distants.
Robert Jacobs
3
Veuillez arrêter la désinformation. SCP nécessite la présence du binaire scp et sera exécuté sur les deux hôtes. SFTP lance également de nouveaux processus à partir d'OpenSSH qui nécessitent le binaire respectif. La plupart des démons FTP font de même.
Florin Asăvoaie