¿Cómo crear un enlace simbólico sin usar ln?

31

Eliminé un enlace simbólico crítico - libc.so.6. Tengo el archivo al que debería apuntar, pero los comandos básicos como lno wgetya no funcionarán debido a que falta el enlace. Sin embargo, echou otros componentes de Bash funcionan.

Estoy buscando una manera de recrear este enlace simbólico.

Sebas
fuente
1
@Sebas, creo que te referías a todos los componentes de Bash , no solo echo.
Cristian Ciupitu
@CristianCiupitu tal vez, ¿qué es? catestá desactivado ... en realidad todo estaba.
Sebas
1
@Sebas, eso es porque cates un programa externo. La página del manual Bash Builtin Commands tiene detalles sobre lo que podría estar disponible.
Cristian Ciupitu
3
Supongo que te refieres a los sistemas basados ​​en GNU / Linux cuando dices "Unix", ya que muchos otros sistemas * nix tienen versiones de "rescate" de las utilidades estándar que están vinculadas estáticamente solo para esos momentos "Uy".
Chris S
Aquí está mi pensamiento de haaber sería la única solución ...
rubenvb

Respuestas:

58

puedes usar ldconfig, recrea el enlace simbólico:

# 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

acabo de probarlo, como ves.

natxo asenjo
fuente
44
Y, convenientemente, / sbin / ldconfig está estáticamente vinculado. ldconfig es responsable de esos enlaces simbólicos en primer lugar.
etherfish
16
Eso no es realmente "conveniente", ¡un binario enlazado estáticamente es prácticamente un componente de diseño necesario de la herramienta que mantiene sus bibliotecas dinámicas! Pero es lo que lo convierte en una herramienta ideal para solucionar este problema, y ​​en mi humilde opinión, la única forma "correcta". La pregunta aquí no se trata realmente de un enlace simbólico eliminado (el 99.999% de ellos se pueden eliminar sin consecuencia), es "rompí la tienda de bibliotecas dinámicas de mi sistema". Haciendo la sugerencia de @ natxo, "arréglalo usando la herramienta que administra esa tienda", obvio y sensato. Cualquier otra cosa (recreación manual del enlace) es una solución alternativa.
FeRD
Sí, esto es más lógico para proceder, aunque la otra respuesta también fue correcta.
Sebas
(nigromancia, lo siento) La razón principal por la que esto importa, por cierto, es que eliminar enlaces simbólicos no es la única forma en que puedes arruinar tu tienda de biblioteca dinámica. Digamos, por ejemplo, que accidentalmente renombró /lib/libc-2.12.soen el ejemplo anterior a /lib/foobar. Bueno, mierda, no más mv. Pero ldconfig -l /lib/foobarincluso es lo suficientemente inteligente como para /lib/libc.so.6señalar el archivo con un nombre incorrecto . (Los argumentos son obligatorios, el valor predeterminado ldconfigignora los nombres de archivo que no comienzan con "lib" y contienen ".so".) En ese momento puede mvvolver (o cp -psi es paranoico / inteligente), luego ldconfigvuelva a ejecutarlo para limpiar .
FeRD
44

CentOS 6 generalmente viene con busyboxun conjunto de herramientas Unix vinculadas estáticamente, instalado en /sbin. Puedes ejecutarlo así:

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6
Mark Plotnick
fuente
1
+1, solo lo probé después de eliminar el enlace simbólico en una prueba de vm, funciona en centos 6.5
natxo asenjo
+1 Esto responde a la pregunta genérica en el título de la pregunta también.
MattBianco
En Debian / Ubuntu es / bin / busybox
PHZ.fi-Pharazon
23

Establezca LD_PRELOAD para precargar la biblioteca relevante. Lo probé con libpthread y parece funcionar:

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
fuente
interesante, se reagrupa con lo que dijeron los demás.
Sebas
21

slncumple exactamente ese propósito: arreglar enlaces simbólicos cuando no puedes usar ln regular porque rompiste un enlace simbólico esencial. Para citar su página de manual:

DESCRIPCIÓN

  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
fuente
bueno, no conocía esta herramienta. En centos es parte de glibc, por lo que debe instalarse por defecto
Natxo asenjo
8

Puede configurar la LD_LIBRARY_PATHvariable para incluir el directorio donde real libc.so.6es:

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

Además, ejecútelo ldconfigpara recrear los enlaces. Esto debería hacer que los comandos funcionen para que luego puedas usar lncomandos para arreglar tu sistema.

Otra forma sería arrancar a través de LiveCD y vincular el archivo allí.

phoops
fuente
Entonces, la única forma de iniciar livecd y vincular el archivo allí en chroot.
phoops
1
Además, debe configurar LD_LIBRARY_PATH para incluir el directorio donde está el archivo libc.so.6. Esto podría permitirle usar los comandos, ya que debería encontrar la biblioteca.
phoops
maldición, lo siento, no pensé en esto primero.
phoops
2
Eso no funciona, porque el archivo vinculado no se llama libc.so.6. Deberá configurar LD_PRELOAD como en mi respuesta.
Dennis Kaarsemaker
1
Lo probé en Fedora 20 y no funcionó.
Cristian Ciupitu
-4

Use scp o sftp para copiar una versión estáticamente vinculada de ln. Asegúrate de que sea ejecutable. Luego úselo para arreglar el archivo.

Robert Jacobs
fuente
1
scp y sftp no funcionarán ya que tampoco podrán cargar ese archivo.
Florin Asăvoaie
scp, sftp, ftp se ejecutarían desde un host remoto. Esto supone que el demonio en la máquina rota ya se está ejecutando. Otras posibilidades para la transferencia de archivos son los sistemas de archivos que ya están montados, ya sea local o remoto.
Robert Jacobs
3
Por favor, detenga la desinformación. SCP requiere que el binario scp esté presente y se ejecutará en ambos hosts. SFTP también lanza nuevos procesos fuera de OpenSSH que requieren el binario respectivo. La mayoría de los demonios FTP hacen lo mismo.
Florin Asăvoaie