Ln kullanmadan sembolik bir bağlantı nasıl oluşturulur?


31

Kritik bir sembolik bağı sildim - libc.so.6. İşaret etmesi gereken dosyaya sahibim, ancak bağlantı eksik olduğundan dolayı gibi temel komutlar çalışmayacak lnveya wgetçalışmayacak. Ancak, echoya da diğer Bash yerleşikleri çalışır.

Bu sembolik bağı yeniden yaratmanın bir yolunu arıyorum.


1
@Sebas, sanırım tüm Bash yapılarını kastetmiştin , sadece değil echo.
Cristian Ciupitu

@CristianCiupitu belki, nedir bu? catdevre dışı bırakıldı ... aslında her şey oldu.
Sebas

1
@Sebas, çünkü catharici bir program. Bash Yerleşik Komutları manuel sayfa mevcut ne olabileceği hakkında detaylar vardır.
Cristian Ciupitu

3
Diğer pek çok * nix sisteminde "Unix" derken GNU / Linux tabanlı sistemleri kastediyorsunuzdur, çünkü sadece "oop" anları için statik olarak bağlanmış standart hizmet programlarının "kurtarma" versiyonları vardır.
Chris S

İşte bana
chrooting'in

Yanıtlar:


58

Ldconfig kullanabilirsiniz, sembolik bağlantıyı yeniden oluşturur:

# 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

sadece gördüğünüz gibi test ettim.


4
Ve, uygun olarak, / sbin / ldconfig statik olarak bağlanmıştır. İdconfig, ilk etapta bu sembolik bağlardan sorumludur.
eter

16
Bu gerçekten sadece "uygun" değil, statik olarak birbirine bağlı bir ikili, dinamik kütüphanelerinizi koruyan aracın hemen hemen gerekli bir tasarım bileşenidir! Ancak, bu sorunu çözmek için ideal bir araç kılan şey budur ve IMHO'nun tek "doğru" yoludur. Buradaki soru gerçekten silinmiş bir sembolik bağlantı ile ilgili değil (bunların% 99.999'u sonuçsuz olarak silinebilir), "Sistemimin dinamik kütüphane deposunu kırdım" dır. @ Natxo'nun önerisini yapmak, "o depoyu yöneten aracı kullanarak düzeltmek", açık ve mantıklı. Başka bir şey (bağlantıyı el ile yeniden oluşturma), geçici bir çözümdür.
FeRD

Evet, bu diğer cevap da doğru olsa bile, devam etmek daha mantıklı.
Sebas

(üzgünüm, üzgünüm) Bu önemli olan BTW, sembolik bağlantıların silinmesi , dinamik kütüphane mağazanızı mahvetmenin tek yolu değil. Örneğin, /lib/libc-2.12.soyukarıdaki örnekte yanlışlıkla yeniden adlandırıldığını söyleyin /lib/foobar. Kahretsin, daha fazla değil mv. Ancak yanlış adlandırılmış dosyaya işaret edecek ldconfig -l /lib/foobarkadar akıllı bile . (Argümanlar zorunludur, varsayılan "lib" ile başlamayan ve ".so" içeren dosya adlarını yoksayar.) Hangi noktada geri (veya paranoyak / akıllıysanız) tekrar temizleyebilirsiniz. . /lib/libc.so.6ldconfigmvcp -pldconfig
FeRD

44

CentOS 6 genellikle busybox, içinde kurulu olan statik olarak bağlı bir Unix araçları seti ile birlikte gelir /sbin. Bu şekilde çalıştırabilirsiniz:

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

1
+1, bir bağıntıyı bir test vm'sinde çıkardıktan hemen sonra test etti, 6.5
çekirdeğinde dokunuyor

+1 Bu, soru başlığındaki genel soruyu da yanıtlar.
MattBianco

Debian / Ubuntu’da / bin / busybox
PHZ.fi-Pharazon

23

İlgili kütüphaneyi önceden yüklemek için LD_PRELOAD değerini ayarlayın. Libpthread ile denedim ve işe yarıyor gibi görünüyor:

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

ilginç, diğerlerinin söyledikleriyle yeniden birleşiyor.
Sebas

21

slntam da bu amaca hizmet eder: temel bir sembolik bağlantıyı kırdığınız için düzenli ln kullanamadığınızda sembolik bağları düzeltmek. Adam sayfasına alıntı yapmak için:

AÇIKLAMA

  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.

güzel, bu aracı bilmiyordum. Centos'ta glibc'nin bir parçası olduğundan, varsayılan olarak yüklenmesi gerekir
natxo asenjo 12:14

8

LD_LIBRARY_PATHGerçek olan dizini eklemek için değişkeni ayarlayabilirsiniz libc.so.6:

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

Ayrıca, ldconfigbağlantıları yeniden oluşturması için yürütün . Bu komutların çalışmasını sağlamalıdır, böylece lnsisteminizi düzeltmek için komutları kullanabilirsiniz .

Başka bir yol da LiveCD aracılığıyla önyükleme yapmak ve orada bağlantı dosyası oluşturmaktır.


Sonra sadece livecd'i başlatmanın ve chroot'taki link dosyasını eklemenin tek yolu var.
saat

1
Ayrıca, LD_LIBRARY_PATH, libc.so.6 dosyasının bulunduğu dizini içerecek şekilde ayarlamanız gerekir. Bu komutları lib'i bulması gerektiği gibi kullanmanıza izin verebilir.
saat

kahretsin, üzgünüm bunu önce düşünmedim.
saat

2
Bu işe yaramıyor, çünkü bağlantılı dosya libc.so.6 olarak adlandırılmamış. Cevabımdaki gibi LD_PRELOAD'u ayarlamanız gerekecek.
Dennis Kaarsemaker 10:14

1
Fedora 20'de denedim ve işe yaramadı.
Cristian Ciupitu

-4

Statik olarak bağlı bir ln sürümünü kopyalamak için scp veya sftp kullanın. Çalıştırılabilir olduğundan emin olun. Sonra dosyayı düzeltmek için kullanın.


1
scp ve sftp bu dosyayı da yükleyemeyecekleri için çalışmazlar.
Florin Asăvoaie

scp, sftp, ftp uzaktaki bir ana bilgisayardan çalıştırılır. Bu, bozuk makinedeki arka plan programının zaten çalıştığını varsayar. Dosya aktarımı için diğer olasılıklar, yerel veya uzak, önceden kurulmuş dosya sistemleridir.
Robert Jacobs

3
Lütfen yanlış bilgiyi durdurun. SCP, scp binary'inin mevcut olmasını gerektirir ve her iki ana bilgisayarda da yürütülecektir. SFTP ayrıca, ilgili ikili kod gerektiren OpenSSH'den yeni işlemler başlatır. FTP servislerinin çoğu aynı şeyi yapar.
Florin Asăvoaie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.