Bagaimana cara membuat tautan simbolis tanpa menggunakan ln?

31

Saya menghapus tautan simbolis kritis - libc.so.6. Saya punya file yang harus dituju, tetapi perintah dasar seperti lnatau wgettidak akan berfungsi lagi karena tautannya hilang. Namun, echoatau bawaan Bash lainnya berfungsi.

Saya mencari cara untuk membuat kembali tautan simbolik ini.

Sebas
sumber
1
@ Sebas, saya pikir Anda maksud semua Bash builtins , bukan hanya echo.
Cristian Ciupitu
@CristianCiupitu mungkin, ada apa? catdinonaktifkan ... sebenarnya semuanya.
Sebas
1
@ Sedas, itu karena catini adalah program eksternal. The Bash Built-in Perintah halaman buku panduan memiliki rincian tentang apa yang dapat tersedia.
Cristian Ciupitu
3
Saya berasumsi maksud Anda sistem berbasis GNU / Linux ketika Anda mengatakan "Unix" karena banyak sistem * nix lainnya memiliki versi "penyelamatan" dari utilitas standar yang terhubung secara statis hanya untuk momen "oops" tersebut.
Chris S
Inilah saya berpikir chroot akan menjadi satu-satunya solusi ...
rubenvb

Jawaban:

58

Anda dapat menggunakan ldconfig, itu menciptakan symlink:

# 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

baru saja mengujinya, seperti yang Anda lihat.

natxo asenjo
sumber
4
Dan, nyamannya, / sbin / ldconfig terhubung secara statis. ldconfig bertanggung jawab atas tautan simbolis itu sejak awal.
etherfish
16
Itu tidak benar-benar hanya "nyaman", biner yang terhubung secara statis cukup banyak komponen desain yang diperlukan dari alat yang mempertahankan perpustakaan dinamis Anda! Tapi itulah yang membuatnya menjadi alat yang ideal untuk memperbaiki masalah ini, dan IMHO satu-satunya cara yang "benar". Pertanyaannya di sini adalah benar-benar bukan tentang symlink yang dihapus (99,999% dari mereka dapat dihapus tanpa konsekuensi), itu "Saya merusak toko perpustakaan dinamis sistem saya". Membuat saran @ natxo, "perbaiki menggunakan alat yang mengelola toko itu", jelas dan masuk akal. Hal lain (membuat ulang tautan secara manual) adalah solusi yang tidak jelas.
FeRD
Ya, ini memang lebih logis untuk dilanjutkan jadi meskipun jawaban yang lain juga benar.
Sebas
(necromancy, maaf) Alasan terbesar hal ini, BTW, menghapus symlink bukanlah satu-satunya cara Anda dapat mengacaukan toko perpustakaan dinamis Anda. Katakan, misalnya, Anda secara tidak sengaja mengganti nama /lib/libc-2.12.sopada contoh di atas menjadi /lib/foobar. Nah, omong kosong, tidak ada lagi mv. Tetapi ldconfig -l /lib/foobarbahkan cukup pintar untuk /lib/libc.so.6menunjukkan file dengan nama yang salah . (Args diperlukan, default ldconfigmengabaikan nama file yang tidak dimulai dengan "lib" dan mengandung ".so".) Pada titik mana Anda dapat mvmengembalikannya (atau cp -pjika Anda paranoid / pintar), kemudian jalankan ldconfiglagi untuk membersihkan .
FeRD
44

CentOS 6 biasanya dilengkapi dengan busybox, seperangkat alat Unix yang terhubung secara statis, terpasang di /sbin. Anda dapat menjalankannya seperti ini:

/sbin/busybox ln -s libc-2.12.so /lib/libc.so.6
Tandai Plotnick
sumber
1
+1, baru mengujinya setelah menghapus symlink dalam tes vm, itu woks dalam centos 6.5
natxo asenjo
+1 Ini menjawab pertanyaan umum dalam judul pertanyaan juga.
MattBianco
Di Debian / Ubuntu, itu adalah / bin / busybox
PHZ.fi-Pharazon
23

Setel LD_PRELOAD untuk memuat sebelumnya perpustakaan yang relevan. Saya mencobanya dengan libpthread dan sepertinya berhasil:

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
sumber
menarik, itu berkumpul kembali dengan apa yang dikatakan orang lain.
Sebas
21

slnmelayani persis tujuan itu: untuk memperbaiki tautan simbolis ketika Anda tidak dapat menggunakan ln biasa karena Anda melanggar symlink penting. Mengutip halaman manualnya:

DESKRIPSI

  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
sumber
bagus, saya tidak tahu alat ini. Dalam centos itu adalah bagian dari glibc, jadi itu harus diinstal secara default
natxo asenjo
8

Anda dapat mengatur LD_LIBRARY_PATHvariabel untuk memasukkan direktori di mana real libc.so.6adalah:

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

Juga, jalankan ldconfiguntuk membuat ulang tautan. Ini akan membuat perintah bekerja sehingga Anda dapat menggunakan lnperintah untuk memperbaiki sistem Anda.

Cara lain adalah dengan booting melalui LiveCD dan tautan file di sana.

phoops
sumber
Maka hanya cara untuk mem-boot livecd dan menautkan file di chroot.
phoops
1
Anda juga harus mengatur LD_LIBRARY_PATH untuk memasukkan direktori di mana file libc.so.6 berada. Ini memungkinkan Anda menggunakan perintah sebagaimana seharusnya menemukan lib.
phoops
Sial, maaf saya tidak memikirkan ini dulu.
phoops
2
Itu tidak berhasil, karena file yang ditautkan tidak bernama libc.so.6. Anda harus menetapkan LD_PRELOAD seperti pada jawaban saya.
Dennis Kaarsemaker
1
Saya mencobanya pada Fedora 20 dan tidak berhasil.
Cristian Ciupitu
-4

Gunakan scp atau sftp untuk menyalin versi ln yang terhubung secara statis. Pastikan itu dapat dieksekusi. Kemudian gunakan untuk memperbaiki file.

Robert Jacobs
sumber
1
scp dan sftp tidak akan berfungsi karena mereka tidak akan dapat memuat file itu juga.
Florin Asăvoaie
scp, sftp, ftp akan dijalankan dari host jarak jauh. Ini mengasumsikan bahwa daemon di mesin yang rusak sudah berjalan. Kemungkinan lain untuk transfer file adalah sistem file yang sudah terpasang, baik lokal maupun jarak jauh.
Robert Jacobs
3
Tolong hentikan informasi yang salah. SCP membutuhkan biner scp untuk hadir dan akan dieksekusi pada kedua host. SFTP juga meluncurkan proses baru dari OpenSSH yang membutuhkan biner masing-masing. Sebagian besar daemon FTP melakukan hal yang sama.
Florin Asăvoaie