Як створити символічне посилання без використання ln?


31

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

Я шукаю спосіб відтворити це символічне посилання.


1
@Sebas, я думаю, ти мав на увазі всі побудови Баша , а не тільки echo.
Крістіан Цюпіту

@ CristianCiupitu, може, що це? catінвалід ... насправді все було.
Себас

1
@Sebas, це тому cat, що це зовнішня програма. На сторінці керівництва Bash Builtin Commands є детальна інформація про те, що може бути доступним.
Крістіан Цюпіту

3
Я маю на увазі, що ви маєте на увазі системи на базі GNU / Linux, коли ви говорите "Unix", як і багато інших * nix систем мають "рятувальні" версії стандартних утиліт, які статично пов'язані саме для цих "ой" моментів.
Chris S

Ось я думаю, що хронування буде єдиним рішенням ...
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

просто випробував це, як бачите.


4
І, зручно, / sbin / ldconfig є статично пов'язаним. ldconfig відповідає в першу чергу за ці символічні посилання.
ефір

16
Це насправді не просто "зручно", статично пов'язаний бінарний файл - це майже необхідний компонент дизайну інструменту, який підтримує ваші динамічні бібліотеки! Але саме це робить його ідеальним інструментом для вирішення цієї проблеми, а ІМХО - єдиним «правильним» способом. Питання тут справді не в тому, щоб видалити символьне посилання (99,999% з них можна видалити без наслідків), це "я порушив динамічний бібліотечний магазин моєї системи". Здійснюючи пропозицію @ natxo, "виправте це за допомогою інструменту, який керує цим магазином", очевидним та розумним. Все інше (відтворення посилання вручну) - хитке вирішення.
FeRD

Так, дійсно більш логічно продовжувати так, хоча й інша відповідь була правильною.
Себас

(некромантія, вибачте) Найважливіша причина цього, BTW, - видалення символьних посилань - це не єдиний спосіб, коли ви зможете накрутити динамічний бібліотечний магазин. Скажімо, наприклад, ви випадково перейменовані /lib/libc-2.12.soв наведеному вище прикладі в /lib/foobar. Ну лайно, не більше mv. Але ldconfig -l /lib/foobarнавіть є досить розумним, щоб /lib/libc.so.6вказати на неправильно названий файл. (Аргументи потрібні, за замовчуванням ldconfigігноруються назви файлів, які не починаються з "lib" і містять ".so".) У цей момент ви можете mvповернути його назад (або cp -pякщо ви параноїдальний / розумний), а потім запустіть ldconfigзнову, щоб очистити .
FeRD

44

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

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

1
+1, щойно тестував його після вилучення симпосилання в тестовому vm, він
прокидається у центрі

+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 та файл посилань.


Тоді єдиний спосіб завантажувати livecd і посилати файл там у chroot.
foops

1
Крім того, вам слід просто встановити LD_LIBRARY_PATH для включення каталогу, де знаходиться файл libc.so.6. Це може дозволити вам використовувати команди так, як слід знайти ліб.
foops

чорт, вибач, що я не подумав про це спочатку.
foops

2
Це не працює, тому що файл, пов’язаний із не названим libc.so.6. Вам потрібно буде встановити LD_PRELOAD як у моїй відповіді.
Денніс Каарсемейкер

1
Я спробував це на Fedora 20, і це не вийшло.
Крістіан Цюпіту

-4

Використовуйте scp або sftp, щоб скопіювати статично пов'язану версію ln. Переконайтеся, що він виконується. Потім використовуйте його, щоб виправити файл.


1
scp і sftp не працюватимуть, оскільки вони також не зможуть завантажити цей файл.
Флорін Асвойае

scp, sftp, ftp буде запущено з віддаленого хоста. Це передбачає, що демон у розбитій машині вже працює. Інші можливості для передачі файлів - це вже встановлені файлові системи, локальні або віддалені.
Роберт Джейкобс

3
Будь ласка, припиніть дезінформацію. SCP вимагає наявності бінарного файлу scp і буде виконуватися на обох хостах. SFTP також запускає нові процеси з OpenSSH, для яких потрібен відповідний бінарний файл. Більшість демонів FTP роблять те ж саме.
Флорін Асвойої
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.