Làm thế nào để tạo một liên kết tượng trưng mà không cần sử dụng ln?


31

Tôi đã xóa một liên kết tượng trưng quan trọng - libc.so.6. Tôi có tập tin cần trỏ tới, nhưng các lệnh cơ bản như lnhoặc wgetsẽ không hoạt động nữa do thiếu liên kết. Tuy nhiên, echohoặc các nội dung Bash khác hoạt động.

Tôi đang tìm cách để tạo lại liên kết tượng trưng này.


1
@Sebas, tôi nghĩ bạn có nghĩa là tất cả các nội dung Bash , không chỉ echo.
Cristian Ciupitu

@CristianCiupitu có lẽ, nó là gì? catbị vô hiệu hóa ... thực sự mọi thứ đã.
Sabas

1
@Sebas, đó là vì catlà một chương trình bên ngoài. Các Bash Builtin Commands thủ công trang có thông tin chi tiết về những gì có thể có sẵn.
Cristian Ciupitu

3
Tôi giả sử bạn có nghĩa là các hệ thống dựa trên GNU / Linux khi bạn nói "Unix" vì nhiều hệ thống * nix khác có các phiên bản "giải cứu" các tiện ích tiêu chuẩn được liên kết tĩnh chỉ trong những khoảnh khắc "oái oăm" đó.
Chris S

Đây là tôi nghĩ rằng chroot sẽ là giải pháp duy nhất ...
rubenvb

Câu trả lời:


58

bạn có thể sử dụng ldconfig, nó tạo lại 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

chỉ cần thử nó, như bạn thấy.


4
Và, một cách thuận tiện, / sbin / ldconfig được liên kết tĩnh. ldconfig chịu trách nhiệm cho những liên kết tượng trưng ở nơi đầu tiên.
etherfish

16
Điều đó không thực sự chỉ là "tiện lợi", một nhị phân được liên kết tĩnh gần như là một thành phần thiết kế cần thiết của công cụ duy trì các thư viện động của bạn! Nhưng nó là thứ khiến nó trở thành một công cụ lý tưởng để khắc phục vấn đề này và IMHO là cách "chính xác" duy nhất. Câu hỏi ở đây thực sự không phải là về một liên kết tượng trưng đã bị xóa (99,999% trong số đó có thể bị xóa mà không có hậu quả), đó là "Tôi đã phá vỡ cửa hàng thư viện động của hệ thống của tôi". Đưa ra gợi ý của @ natxo, "sửa nó bằng công cụ quản lý cửa hàng đó", rõ ràng và hợp lý. Bất cứ điều gì khác (tự tạo lại liên kết) là một cách giải quyết khó khăn.
FeRD

Vâng, điều này thực sự hợp lý hơn để tiến hành vì vậy mặc dù câu trả lời khác cũng đúng.
Sebas

(necromancy, xin lỗi) Lý do lớn nhất vấn đề này, BTW, là xóa các liên kết tượng trưng không phải là cách duy nhất bạn có thể làm hỏng cửa hàng thư viện động của mình. Nói, ví dụ, bạn vô tình đổi tên /lib/libc-2.12.sotrong ví dụ trên thành /lib/foobar. Chà, tào lao, không còn nữa mv. Nhưng ldconfig -l /lib/foobarthậm chí đủ thông minh để /lib/libc.so.6chỉ ra tệp sai tên . (Các đối số là bắt buộc, mặc định ldconfigbỏ qua tên tệp không bắt đầu bằng "lib" và chứa ".so".) Tại thời điểm đó, bạn có thể mvquay lại (hoặc cp -pnếu bạn bị hoang tưởng / thông minh), sau đó chạy ldconfiglại để dọn dẹp .
FeRD

44

CentOS 6 thường đi kèm với busybox, một bộ công cụ Unix được liên kết tĩnh, được cài đặt trong /sbin. Bạn có thể chạy nó như thế này:

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

1
+1, chỉ cần kiểm tra nó sau khi xóa symlink trong vm thử nghiệm, nó sẽ chạy theo centos 6.5
natxo asenjo

+1 Điều này cũng trả lời câu hỏi chung trong tiêu đề câu hỏi.
MattBianco

Trên Debian / Ubuntu, nó / bin / busybox
PHZ.fi-Pharazon

23

Đặt LD_PRELOAD để tải trước thư viện có liên quan. Tôi đã thử nó với libpthread và nó dường như hoạt động:

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

Thật thú vị, nó tập hợp lại với những gì người khác nói.
Sebas

21

slnphục vụ chính xác mục đích đó: để sửa các liên kết tượng trưng khi bạn không thể sử dụng ln thông thường vì bạn đã phá vỡ một liên kết tượng trưng thiết yếu. Để trích dẫn trang người đàn ông của nó:

SỰ MIÊU TẢ

  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.

thật tuyệt, tôi không biết công cụ này Trong centos, nó là một phần của glibc, vì vậy nó phải được cài đặt theo mặc định
natxo asenjo

8

Bạn có thể đặt LD_LIBRARY_PATHbiến để bao gồm thư mục trong đó có thực libc.so.6:

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

Ngoài ra, thực hiện ldconfigcho nó để tạo lại các liên kết. Điều này sẽ làm cho các lệnh hoạt động để sau đó bạn có thể sử dụng lncác lệnh để sửa hệ thống của bạn.

Một cách khác là khởi động qua LiveCD và liên kết tệp ở đó.


Sau đó, cách duy nhất để khởi động livecd và liên kết tập tin có trong chroot.
phoops

1
Ngoài ra, bạn chỉ nên đặt LD_LIBRARY_PATH để bao gồm thư mục chứa tệp libc.so.6. Điều này có thể cho phép bạn sử dụng các lệnh vì nó sẽ tìm lib.
phoops

chết tiệt, xin lỗi tôi đã không nghĩ đến điều này đầu tiên
phoops

2
Điều đó không hoạt động, vì tập tin được liên kết đến không có tên libc.so.6. Bạn sẽ cần đặt LD_PRELOAD như trong câu trả lời của tôi.
Dennis Kaarsemaker

1
Tôi đã thử nó trên Fedora 20 và nó không hoạt động.
Cristian Ciupitu

-4

Sử dụng scp hoặc sftp để sao chép phiên bản ln được liên kết tĩnh. Hãy chắc chắn rằng nó có thể thực thi được. Sau đó sử dụng nó để sửa tập tin.


1
scp và sftp sẽ không hoạt động vì chúng cũng không thể tải tập tin đó.
Florin Asăvoaie

scp, sftp, ftp sẽ được chạy từ một máy chủ từ xa. Điều này giả định rằng daemon trong máy bị hỏng đã chạy. Các khả năng khác để truyền tệp là các hệ thống tệp đã được gắn kết, cục bộ hoặc từ xa.
Robert Jacobs

3
Hãy ngừng thông tin sai lệch. SCP yêu cầu nhị phân scp phải có mặt và sẽ được thực thi trên cả hai máy chủ. SFTP cũng khởi chạy các quy trình mới từ OpenSSH yêu cầu nhị phân tương ứng. Hầu hết các daemon FTP đều làm như vậy.
Florin Asăvoaie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.