Jak utworzyć dowiązanie symboliczne bez użycia ln?

31

Usunąłem krytyczny link symboliczny - libc.so.6. Mam plik, na który powinien wskazywać, ale podstawowe polecenia, takie jak lnlub wgetnie będą już działać z powodu braku łącza. Jednak działają echoinne wbudowane Bash.

Szukam sposobu na odtworzenie tego dowiązania symbolicznego.

Sebas
źródło
1
@Sebas, myślę, że miałeś na myśli wszystkie wbudowane Bash , nie tylko echo.
Cristian Ciupitu
@CristianCiupitu może, co to jest? catjest wyłączone ... właściwie wszystko było.
Sebas
1
@Sebas, ponieważ catjest to program zewnętrzny. Bash Builtin Komendy instrukcja zawiera szczegółowe informacje na temat tego, co może być niedostępna.
Cristian Ciupitu
3
Zakładam, że masz na myśli systemy oparte na GNU / Linux, kiedy mówisz „Unix”, ponieważ wiele innych systemów * nix ma wersje „ratownicze” standardowych narzędzi, które są statycznie powiązane tylko w tych momentach „ups”.
Chris S,
Oto, jak myślę, że
chrootowanie

Odpowiedzi:

58

możesz użyć ldconfig, odtwarza symboliczne łącze:

# 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

właśnie to przetestowałem, jak widzisz.

natxo asenjo
źródło
4
I, dogodnie, / sbin / ldconfig jest statycznie powiązany. ldconfig jest przede wszystkim odpowiedzialny za te dowiązania symboliczne.
Eterfish
16
To nie jest tak naprawdę „wygodne”, statycznie powiązany plik binarny jest właściwie niezbędnym komponentem projektowym narzędzia, które utrzymuje biblioteki dynamiczne! Ale to sprawia, że ​​jest to idealne narzędzie do rozwiązania tego problemu, a IMHO jest jedynym „poprawnym” sposobem. Pytanie tutaj tak naprawdę nie dotyczy usuniętego dowiązania symbolicznego (99,999% z nich można usunąć bez konsekwencji), to „Zepsułem dynamiczny magazyn bibliotek mojego systemu”. Stworzenie sugestii @ natxo: „napraw to za pomocą narzędzia zarządzającego tym sklepem”, oczywiste i rozsądne. Cokolwiek innego (ręczne odtwarzanie linku) to hacky obejście.
FeRD
Tak, jest to bardziej logiczne, aby kontynuować, nawet jeśli druga odpowiedź również była poprawna.
Sebas
(nekromancja, przepraszam) Największy powód, dla którego to ważne, BTW, polega na usuwaniu dowiązań symbolicznych, to nie jedyny sposób, aby zepsuć swój dynamiczny sklep z bibliotekami. Powiedzmy na przykład, że przypadkowo zmieniłeś nazwę /lib/libc-2.12.sow powyższym przykładzie na /lib/foobar. Cholera, nic więcej mv. Ale ldconfig -l /lib/foobarjest nawet wystarczająco inteligentny, aby /lib/libc.so.6wskazać plik o niewłaściwej nazwie . (Argumenty są wymagane, domyślnie ldconfigignorowane są nazwy plików, które nie zaczynają się od „lib” i zawierają „.so”.). W tym momencie możesz mvto cofnąć (lub cp -pjeśli jesteś paranoikiem / sprytny), a następnie uruchom ldconfigponownie, aby wyczyścić .
FeRD
44

CentOS 6 zazwyczaj zawiera busyboxstatycznie połączony zestaw narzędzi uniksowych /sbin. Możesz uruchomić go w następujący sposób:

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6
Mark Plotnick
źródło
1
+1, właśnie przetestowałem go po usunięciu dowiązania symbolicznego w vm testowym, woks w centos 6.5
natxo asenjo
+1 Odpowiada to również na ogólne pytanie zawarte w tytule pytania.
MattBianco
Na Debianie / Ubuntu jest to / bin / busybox
PHZ.fi-Pharazon
23

Ustaw LD_PRELOAD, aby wstępnie załadować odpowiednią bibliotekę. Wypróbowałem to z libpthread i wydaje się, że działa:

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
źródło
ciekawe, przegrupowuje się z tym, co powiedzieli inni.
Sebas
21

slnsłuży dokładnie temu celowi: naprawić dowiązania symboliczne, gdy nie możesz użyć zwykłego ln, ponieważ złamałeś niezbędne dowiązanie symboliczne. Cytując jego stronę podręcznika:

OPIS

  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
źródło
miło, nie znałem tego narzędzia. W centos jest częścią glibc, więc musi być domyślnie zainstalowany
natxo asenjo
8

Możesz ustawić LD_LIBRARY_PATHzmienną tak, aby zawierała katalog, w którym rzeczywiste libc.so.6jest:

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

Wykonaj również, ldconfigaby odtworzyć łącza. To powinno sprawić, że polecenia będą działać, abyś mógł następnie użyć lnpoleceń do naprawy systemu.

Innym sposobem byłoby uruchomienie za pomocą LiveCD i połączenie pliku.

phoops
źródło
Wtedy jedynym sposobem na uruchomienie LIVECD i link do pliku w chroot.
phoops
1
Powinieneś także ustawić LD_LIBRARY_PATH tak, aby zawierał katalog, w którym znajduje się plik libc.so.6. Może to pozwolić na użycie poleceń tak, jak powinno znaleźć bibliotekę lib.
phoops
cholera, przepraszam, nie pomyślałem o tym pierwszym.
phoops
2
To nie działa, ponieważ plik, do którego prowadzi link, nie ma nazwy libc.so.6. Musisz ustawić LD_PRELOAD jak w mojej odpowiedzi.
Dennis Kaarsemaker
1
Próbowałem na Fedorze 20 i nie działało.
Cristian Ciupitu
-4

Użyj scp lub sftp, aby skopiować statycznie połączoną wersję ln. Upewnij się, że jest wykonywalny. Następnie użyj go, aby naprawić plik.

Robert Jacobs
źródło
1
scp i sftp nie będą działać, ponieważ nie będą mogły również załadować tego pliku.
Florin Asăvoaie
scp, sftp, ftp będą uruchamiane ze zdalnego hosta. Zakłada się, że demon na uszkodzonej maszynie już działa. Inne możliwości przesyłania plików to systemy plików, które są już zamontowane, lokalne lub zdalne.
Robert Jacobs
3
Przestań wprowadzać w błąd. SCP wymaga obecności pliku binarnego scp i zostanie wykonany na obu hostach. SFTP uruchamia także nowe procesy z OpenSSH, które wymagają odpowiedniego pliku binarnego. Większość demonów FTP robi to samo.
Florin Asăvoaie