วิธีสร้างลิงค์สัญลักษณ์โดยไม่ใช้ ln


31

ฉันลบลิงค์สัญลักษณ์ที่สำคัญแล้ว - libc.so.6. ฉันมีไฟล์ที่ควรชี้ไป แต่คำสั่งพื้นฐานเช่นlnหรือwgetจะไม่ทำงานอีกต่อไปเนื่องจากลิงก์หายไป อย่างไรก็ตามechoหรืองานอื่น ๆ ของ Bash builtins

ฉันกำลังมองหาวิธีสร้างลิงก์สัญลักษณ์นี้ใหม่


1
@Sebas ผมคิดว่าคุณหมายถึงทั้งหมดbuiltins ทุบตีechoไม่เพียง
Cristian Ciupitu

@CristianCiupitu บางทีมันคืออะไร? catถูกปิดใช้งาน ... จริง ๆ แล้วทุกอย่างเป็น
Sebas

1
@Sebas นั่นเป็นเพราะcatเป็นโปรแกรมภายนอก ทุบตี Builtin คำสั่งหน้าคู่มือที่มีรายละเอียดเกี่ยวกับสิ่งที่อาจจะใช้ได้
Cristian Ciupitu

3
ฉันถือว่าคุณหมายถึงระบบที่ใช้ GNU / Linux เมื่อคุณพูดว่า "Unix" เนื่องจากระบบ * nix อื่น ๆ จำนวนมากมี "ยูทิลิตี้" เวอร์ชันของยูทิลิตี้มาตรฐานที่เชื่อมโยงแบบคงที่สำหรับช่วงเวลา "โอ๊ะ" เหล่านั้น
Chris S

นี่คือฉันคิด chrooting จะเป็นเพียงการแก้ปัญหา ...
rubenvb

คำตอบ:


58

คุณสามารถใช้ ldconfig มันสร้าง 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

เพียงแค่ทดสอบอย่างที่คุณเห็น


4
และสิ่งอำนวยความสะดวกนั้น / sbin / ldconfig จะถูกเชื่อมโยงแบบคงที่ ldconfig รับผิดชอบการเชื่อมโยงสัญลักษณ์เหล่านั้นตั้งแต่แรก
etherfish

16
นั่นไม่ใช่แค่ "ความสะดวก" จริงๆแล้วไบนารีที่เชื่อมโยงแบบสแตติกนั้นเป็นองค์ประกอบการออกแบบที่จำเป็นของเครื่องมือที่จะรักษาไลบรารีแบบไดนามิกของคุณ! แต่มันเป็นสิ่งที่ทำให้มันเป็นเครื่องมือที่เหมาะสำหรับการแก้ไขปัญหานี้และ IMHO เป็นวิธีที่ "ถูกต้อง" เท่านั้น คำถามที่นี่ไม่ได้เกี่ยวกับ symlink ที่ถูกลบ (99.999% ของสิ่งเหล่านั้นสามารถลบได้โดยไม่มีผล) มันคือ "ฉันทำลายที่เก็บไลบรารีแบบไดนามิกของระบบของฉัน" ทำตามคำแนะนำของ @ natxo "แก้ไขโดยใช้เครื่องมือที่จัดการร้านค้านั้น" ชัดเจนและสมเหตุสมผล สิ่งอื่นใด (สร้างลิงค์ใหม่ด้วยตนเอง) คือวิธีแก้ปัญหาที่แฮ็ก
FeRD

ใช่นี่เป็นเหตุผลที่ดีกว่าที่จะดำเนินการต่อไปแม้ว่าคำตอบอื่น ๆ จะถูกต้องเช่นกัน
Sebas

(ข้อผิดพลาดขออภัย) เหตุผลที่สำคัญที่สุดในเรื่องนี้คือ BTW กำลังลบ symlink ไม่ใช่วิธีเดียวที่คุณจะทำให้ร้านค้าห้องสมุดของคุณพลวัต กล่าวว่าสำหรับตัวอย่างเช่นคุณเปลี่ยนชื่อตั้งใจในตัวอย่างข้างต้นไป/lib/libc-2.12.so ดีอึไม่มาก/lib/foobar mvแต่ldconfig -l /lib/foobarฉลาดพอที่จะ/lib/libc.so.6ชี้ไปที่ไฟล์ที่มีชื่อผิด (จำเป็นต้องมีค่าเริ่มต้นldconfigละเว้นชื่อไฟล์ที่ไม่ได้ขึ้นต้นด้วย "lib" และมี ".so") ณ จุดนี้คุณสามารถmvย้อนกลับได้ (หรือcp -pถ้าคุณหวาดระแวง / ฉลาด) จากนั้นเรียกใช้ldconfigอีกครั้งเพื่อล้างข้อมูล .
2559

44

CentOS 6 โดยทั่วไปมาพร้อมกับbusyboxชุดแบบคงที่เชื่อมโยงของเครื่องมือ Unix, /sbinติดตั้งใน คุณสามารถเรียกใช้เช่นนี้:

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

1
+1 เพิ่งทดสอบหลังจากลบ symlink ในการทดสอบ vm มันจะทำงานใน centos 6.5
natxo asenjo

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

ที่น่าสนใจมันจัดกลุ่มกับสิ่งที่คนอื่นพูด
Sebas

21

slnทำหน้าที่ตรงตามวัตถุประสงค์ดังกล่าว: เพื่อแก้ไขลิงก์สัญลักษณ์เมื่อคุณไม่สามารถใช้ ln ปกติได้เนื่องจากคุณทำลาย symlink ที่สำคัญ วิธีอ้างหน้าคนของมัน:

รายละเอียด

  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
phoops

1
นอกจากนี้คุณควรตั้งค่า LD_LIBRARY_PATH ให้รวมไดเรกทอรีที่ไฟล์ libc.so.6 สิ่งนี้อาจช่วยให้คุณใช้คำสั่งตามที่ควรหา lib
phoops

ยี้ขอโทษฉันไม่ได้คิดถึงเรื่องนี้ก่อน
phoops

2
ไม่สามารถใช้งานได้เนื่องจากไฟล์ที่เชื่อมโยงกับไม่มีชื่อ libc.so.6 คุณจะต้องตั้งค่า LD_PRELOAD ในคำตอบของฉัน
Dennis Kaarsemaker

1
ฉันลองมันใน Fedora 20 แล้วก็ใช้ไม่ได้
Cristian Ciupitu

-4

ใช้ scp หรือ sftp เพื่อคัดลอก ln ที่ลิงก์แบบคงที่ ตรวจสอบให้แน่ใจว่าปฏิบัติการได้ จากนั้นใช้เพื่อแก้ไขไฟล์


1
SCP และ SFTP จะไม่ทำงานเนื่องจากจะไม่สามารถโหลดไฟล์นั้นได้
Florin Asăvoaie

scp, sftp, ftp จะถูกเรียกใช้จากโฮสต์ระยะไกล สิ่งนี้จะถือว่า daemon ในเครื่องที่เสียหายทำงานอยู่แล้ว ความเป็นไปได้อื่น ๆ สำหรับการถ่ายโอนไฟล์คือระบบไฟล์ที่ถูกเมาท์อยู่แล้วไม่ว่าจะเป็นแบบโลคัลหรือรีโมต
Robert Jacobs

3
กรุณาหยุดข้อมูลที่ผิด SCP ต้องการไบนารีของ SCP ในการแสดงตนและจะถูกประหารทั้งสองครอบครัว SFTP ยังเปิดตัวกระบวนการใหม่จาก OpenSSH ที่ต้องการไบนารีที่เกี่ยวข้อง FTP daemons ส่วนใหญ่ทำแบบเดียวกัน
Florin Asăvoaie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.