Как создать символическую ссылку без использования ln?

31

Я удалил критическую символическую ссылку libc.so.6. У меня есть файл, на который он должен указывать, но основные команды, такие как lnили wgetбольше не будут работать из-за отсутствия ссылки. Однако echoили другие встроенные функции Bash работают.

Я ищу способ воссоздать эту символическую ссылку.

Sebas
источник
1
@ Себас, я думаю, ты имел в виду все встроенные функции Bash , а не только echo.
Кристиан Чиупиту
@CristianCiupitu, может быть, что это? catотключено ... на самом деле все было.
Себас
1
@Sebas, потому что catэто внешняя программа. Bash Builtin Команды страничное руководство содержит информацию о том, что может быть доступно.
Кристиан Чиупиту
3
Я предполагаю, что вы имеете в виду системы на основе GNU / Linux, когда говорите «Unix», поскольку многие другие системы * nix имеют «спасательные» версии стандартных утилит, которые статически связаны только для этих «упс» моментов.
Крис С
Вот я и думаю, что chroot будет единственным решением ...
rubenvb

Ответы:

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

только что проверил, как видите.

natxo asenjo
источник
4
И, что удобно, / sbin / ldconfig статически связан. ldconfig отвечает за эти символические ссылки в первую очередь.
etherfish
16
Это на самом деле не просто «удобно», статически связанный двоичный файл - это в значительной степени необходимый компонент разработки инструмента, который поддерживает ваши динамические библиотеки! Но это то, что делает его идеальным инструментом для решения этой проблемы, и ИМХО единственным «правильным» способом. Вопрос здесь не в удаленной символической ссылке (99,999% из них можно удалить без последствий), а в том, что «я сломал хранилище динамических библиотек моей системы». Предложение @ natxo «исправить это с помощью инструмента, который управляет этим магазином», очевидно и разумно. Все остальное (воссоздание ссылки вручную) - это хакерский обходной путь.
FeRD
Да, это действительно более логично, поэтому другой ответ тоже был верным.
Себас
(некромантия, извините) Самая большая причина, по которой это имеет значение, кстати, удаление символических ссылок - не единственный способ испортить хранилище динамических библиотек. Скажем, например, вы случайно переименовали /lib/libc-2.12.soв приведенном выше примере в /lib/foobar. Ну, дерьмо, не более mv. Но ldconfig -l /lib/foobarдаже достаточно умен, чтобы /lib/libc.so.6указать на файл с неправильным именем . (Аргументы обязательны, по умолчанию ldconfigигнорируются имена файлов, которые не начинаются с «lib» и содержат «.so».) В этот момент вы можете mvвернуться (или, cp -pесли вы параноик / умный), а затем ldconfigснова запустить, чтобы очистить ,
Февраль
44

CentOS 6, как правило, поставляется со busyboxстатически связанным набором инструментов Unix, установленным в /sbin. Вы можете запустить его так:

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6
Марк Плотник
источник
1
+1, только что проверил его после удаления символической ссылки в тестовом vm, он просыпается в centos 6.5
natxo asenjo
+1 Это также отвечает на общий вопрос в названии вопроса.
MattBianco
В Debian / Ubuntu это / bin / busybox
PHZ.fi-Pharazon
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...
Деннис Каарсемакер
источник
интересно, это переписывается с тем, что говорили другие.
Себас
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
8

Вы можете установить LD_LIBRARY_PATHпеременную, чтобы включить каталог, где реальный libc.so.6:

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

Также выполните ldconfigдля него воссоздание ссылок. Это должно заставить команды работать, чтобы вы могли затем использовать lnкоманды для исправления вашей системы.

Другим способом было бы загрузиться через LiveCD и связать там файл.

phoops
источник
Тогда единственный способ загрузиться с livecd и связать файл там в chroot.
фотки
1
Кроме того, вы должны просто установить LD_LIBRARY_PATH для включения каталога, в котором находится файл libc.so.6. Это может позволить вам использовать команды так, как это должно найти библиотеку.
фотки
черт, извините, я не думал об этом первым.
phoops
2
Это не работает, потому что файл, на который ссылаются, не называется libc.so.6. Вам нужно установить LD_PRELOAD, как в моем ответе.
Деннис Каарсемакер
1
Я попробовал это на Fedora 20, и это не сработало.
Кристиан Чиупиту
-4

Используйте scp или sftp, чтобы скопировать статически связанную версию ln. Убедитесь, что это исполняемый файл. Затем используйте его, чтобы исправить файл.

Роберт Джейкобс
источник
1
scp и sftp не будут работать, так как они не смогут загрузить этот файл.
Florin Asăvoaie
scp, sftp, ftp будут запускаться с удаленного хоста. Это предполагает, что демон на сломанной машине уже работает. Другие возможности для передачи файлов - это уже смонтированные файловые системы, локальные или удаленные.
Роберт Джейкобс
3
Пожалуйста, прекратите дезинформацию. SCP требует наличия двоичного файла scp и будет выполняться на обоих хостах. SFTP также запускает новые процессы из OpenSSH, для которых требуется соответствующий двоичный файл. Большинство демонов FTP делают то же самое.
Florin Asăvoaie