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


He eliminado un enlace simbólico crítico - libc.so.6. Tengo el archivo al que debería apuntar, pero los comandos básicos como ln o wget No funcionará más debido a que falta el enlace. Sin embargo, echo u otro Bash builtins trabajo.

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


31
2018-05-10 18:05


origen


@Sebas, creo que quisiste decir todo el Bash builtins, No solo echo. - Cristian Ciupitu
@CristianCiupitu tal vez, ¿qué es? cat está deshabilitado ... en realidad todo fue. - Sebas
@Sebas, eso es porque cat Es un programa externo. los Bash Builtin Commands La página de manual tiene detalles sobre lo que podría estar disponible. - Cristian Ciupitu
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 "oops". - Chris S
Ajusté las banderas. Gracias - Sebas


Respuestas:


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

Sólo lo probé, como ves.


58
2018-05-11 06:02



Y, convenientemente, el / sbin / ldconfig está vinculado estáticamente. ldconfig es responsable de esos enlaces simbólicos en primer lugar. - etherfish
¡Eso no es realmente solo "conveniente", un binario estáticamente vinculado 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 opinión, la única forma "correcta". La pregunta aquí no es realmente acerca de un enlace simbólico eliminado (el 99,999% de ellos pueden eliminarse sin consecuencias), es "rompí la biblioteca dinámica de mi sistema". Hacer la sugerencia de @ natxo, "arreglarlo usando la herramienta que gestiona esa tienda", obvio y sensato. Cualquier otra cosa (recreando manualmente el enlace) es una solución pirata. - FeRD
Sí, esto es ciertamente más lógico para proceder, a pesar de que la otra respuesta también fue correcta. - Sebas
(nigromancia, lo siento) La razón más importante por la que esto importa, por cierto, es borrando Los enlaces simbólicos no son la única forma en que puedes arruinar tu tienda de biblioteca dinámica. Digamos, por ejemplo, que renombraste accidentalmente /lib/libc-2.12.so en el ejemplo anterior para /lib/foobar. Bueno, mierda, no más mv. Pero ldconfig -l /lib/foobar es incluso lo suficientemente inteligente como para hacer /lib/libc.so.6 señala al mal llamado expediente. (Los argumentos son obligatorios, por defecto ldconfig ignora los nombres de archivo que no comienzan con "lib" y contienen ".so".) En qué punto puedes mv de vuelta (o cp -p Si eres paranoico / inteligente), entonces ejecuta ldconfig de nuevo para limpiar. - FeRD


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

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6

43
2018-05-10 22:30



+1, solo lo probé después de eliminar el enlace simbólico en una prueba de video, 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


Configure 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...

23
2018-05-10 19:32



Interesante, se reagrupa con lo dicho por los demás. - Sebas


sln sirve exactamente para ese propósito: corregir enlaces simbólicos cuando no puede usar ln regular porque rompió 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.

21
2018-05-12 11:15



Bien, no conocía esta herramienta. En centos es parte de glibc, por lo que debe instalarse por defecto - natxo asenjo


Puede establecer LD_LIBRARY_PATH variable para incluir el directorio donde real libc.so.6 es:

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

Además, ejecutar ldconfig Para ello recrear los enlaces. Esto debería hacer que los comandos funcionen para que luego puedas usar ln Comandos para arreglar su sistema.

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


8
2018-05-10 18:12



Entonces, la única manera de arrancar livecd y vincular el archivo allí es chroot. - phoops
Además, solo debes configurar LD_LIBRARY_PATH para incluir el directorio donde se encuentra el archivo libc.so.6. Esto podría permitirte usar los comandos ya que debería encontrar la biblioteca. - phoops
Maldición, lo siento, no pensé en esto primero. - phoops
Eso no funciona, porque el archivo vinculado no se llama libc.so.6. Tendrá que configurar LD_PRELOAD como en mi respuesta. - Dennis Kaarsemaker
Lo probé en Fedora 20 y no funcionó. - Cristian Ciupitu


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


-4
2018-05-11 21:27



scp y sftp no funcionarán ya que tampoco podrán cargar ese archivo. - Florin Asăvoaie
scp, sftp, ftp se ejecutaría 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
Por favor deja de 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