ย้ายถังขยะและโฟลเดอร์อื่นแล้ว! จะนำพวกเขากลับมาได้อย่างไร


13

ฉันย้ายโฟลเดอร์ทั้งหมดจากรูทไปยังโฟลเดอร์ย่อยโดยไม่ตั้งใจ ( /bin, /etc, /home, /lib, /usr... ทั้งหมดย้าย) คนเดียวที่ไม่ได้ถูกย้ายเนื่องจากพวกเขาถูกนำมาใช้เป็น /bak, /boot, /dev, ,/proc/sys

ตอนนี้คำสั่งใด ๆ ที่ฉันพยายามเรียกใช้จะไม่เกิดขึ้น ฉันได้รับ "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าวอยู่ตลอด"

ฉันเชื่อมต่อผ่าน ssh และผ่าน ftp แต่ฉันไม่สามารถย้ายไฟล์ผ่าน ftp ได้เนื่องจากการเข้าสู่ระบบโดยตรงของ SU ถูกปิดใช้งาน ฉันยังสามารถเข้าถึงเซิร์ฟเวอร์จริงได้หากฉันต้องการทำบางสิ่งโดยตรงจากที่นั่น

ฉันสมมติว่าฉันจะต้องแก้ไขไฟล์กำหนดค่าเพื่อบอกตำแหน่งว่าจะค้นหา/binโฟลเดอร์ได้ที่ไหนและนั่นจะช่วยให้ฉันสามารถเข้าถึงได้อีกครั้ง แต่ฉันไม่รู้ว่าไฟล์ใดที่ควรจะเป็นหรือวิธีการทำ (ตั้งแต่ฉัน ไม่สามารถแม้แต่เรียกใช้chmodเพื่อเปลี่ยนสิทธิ์)

มีวิธีอื่นนอกเหนือจากการติดตั้งใหม่หรือไม่?

ฉันกำลังทำงานกับ CentOS เวอร์ชันเก่า

ฉันใหม่มากในโลกของ Linux ดังนั้นการกระทำนี้และคำถาม ...


แม้ว่าจะไม่ใช่วิธีแก้ปัญหาของคุณฉันขอแนะนำให้อ่านสิ่งนี้: lug.wsu.edu/node/414สถานการณ์ที่คล้ายกัน แต่จริง ๆ แล้วเขาก็ลบ / bin
stribika

คำตอบ:


33

หากคุณยังมีรูทเชลล์คุณอาจมีโอกาสซ่อมแซมระบบของคุณ สมมติว่าคุณย้ายทั้งหมดไดเรกทอรีที่พบบ่อย ( /bin, /etc, /lib, /sbin, /usr- เหล่านี้เป็นคนที่จะทำให้การกู้คืนยาก) /oopsภายใต้

คุณจะไม่สามารถที่จะออกคำสั่งโดยตรงแม้ว่าคุณระบุเส้นทางแบบเต็มmv /oops/bin/mvนั่นเป็นเพราะmvเป็นเชื่อมโยงแบบไดนามิก ; เนื่องจากคุณย้าย/libไดเรกทอรีไปแล้วmvไม่สามารถทำงานได้เพราะไม่พบห้องสมุดที่เป็นส่วนหนึ่งของรหัส ในความเป็นจริงมันยิ่งแย่ไปกว่านั้น: mvไม่พบตัวโหลดแบบไดนามิก /lib/ld-linux.so.2 (ชื่ออาจแตกต่างกันไปขึ้นอยู่กับสถาปัตยกรรมและตัวแปรยูนิกซ์ของคุณและไดเรกทอรีอาจเป็นชื่ออื่นเช่น/lib32หรือ/lib64) ดังนั้นจนกว่าคุณจะย้าย/libไดเรกทอรีกลับมาคุณจะต้องเรียกใช้ตัวเชื่อมโยงอย่างชัดเจนและคุณต้องระบุเส้นทางไปยังไลบรารีที่ย้ายแล้ว นี่คือคำสั่งทดสอบบน Debian squeeze i386

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/i386-linux-gnu
/oops/lib/ld-linux.so.2 /oops/bin/mv /oops/* /

คุณอาจจำเป็นต้องปรับเปลี่ยนนี้เล็กน้อยสำหรับการกระจายหรือสถาปัตยกรรมอื่น ๆ ตัวอย่างเช่นสำหรับ CentOS ใน x86_64:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib64
/oops/lib64/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /

เมื่อคุณทำบางสิ่งผิดพลาด/libมันจะช่วยให้กล่องเครื่องมือที่เชื่อมโยงอยู่กับที่อยู่นิ่ง ๆ บางกระจาย (ผมไม่ทราบเกี่ยวกับ CentOS) จัดให้มีสำเนาแบบคงที่เชื่อมโยงของBusybox นอกจากนี้ยังมีสายสะพายเปลือกแบบสแตนด์อโลนที่มีหลายคำสั่งในตัว หากคุณมีหนึ่งในนั้นคุณสามารถกู้คืนจากที่นั่น หากคุณยังไม่ได้ติดตั้งก่อนหน้านี้มันก็สายเกินไป

# mkdir /oops
# mv /lib /bin /oops
# sash
Stand-alone shell (version 3.7)
> -mv /oops/* /
> exit

หากคุณไม่มีรูตเชลล์อีกต่อไป แต่คุณยังมี SSH daemon คอยฟังอยู่และคุณสามารถล็อกอินโดยตรงในฐานะรูทบน ssh และคุณมีกล่องเครื่องมือที่เชื่อมโยงกับสแตติกเหล่านี้คุณอาจจะสามารถ ssh ได้ สามารถทำงานได้หากคุณได้ย้าย/libและแต่ไม่/bin/etc

ssh root@broken.example.com /oops/bin/sash
root@broken.example.com's password:
Stand-alone shell (version 3.7)
> -mv /oops/* /

ผู้ดูแลระบบบางรายตั้งค่าบัญชีสำรองที่มีเชลล์ที่เชื่อมโยงแบบสแตติกหรือทำให้บัญชีรูทใช้เชลล์ที่ลิงก์แบบสแตติก แต่เพียงผู้เดียวสำหรับปัญหาประเภทนี้

หากคุณไม่มีรูทเชลล์และยังไม่มีข้อควรระวังคุณจะต้องบูตจาก Linux Live CD / USB (สิ่งใดจะทำตราบใดที่มันยังไม่พอที่จะเข้าถึงดิสก์และระบบไฟล์ของคุณ) และ ย้ายไฟล์กลับ


1
ขอบคุณ Gilles คุณได้ให้ข้อมูลที่มีประโยชน์มากเกี่ยวกับสิ่งที่ฉันควรระวังในอนาคต
Menelaos

ขอบคุณ Gilles! สิ่งนี้ช่วยฉัน ฉันได้เพิ่มการแก้ไขสำหรับ linux env 64 บิต ในกรณีของฉัน CentOS 7 แบบ 64 บิต
CompEng88

@ ComputerEngineer88 ขอบคุณ แต่เมื่อคุณทำการแก้ไขโปรดอย่าเพิ่มเครื่องหมาย“ แก้ไข” หรือเพิ่มในตอนท้ายของโพสต์ที่ไม่ได้อยู่ ทำให้การไหลของข้อความ โพสต์มีประวัติการแก้ไขหากผู้คนต้องการทราบว่าโพสต์นั้นมีอะไรบ้าง เมื่อคนอ่านโพสต์ตามปกติพวกเขาไม่สนใจว่าจะมีการเพิ่มบิตในภายหลัง
Gilles 'หยุดชั่วร้าย'

จริงๆ? ฉันมักจะมุ่งเน้นไปที่การแก้ไข หมายถึงสิ่งใหม่ที่ได้เรียนรู้และสำหรับฉันนั้นสำคัญที่สุด เหมือนกันทั้งหมด - ตราบใดที่ผู้คนได้รับประโยชน์!
CompEng88

@ ComputerEngineer88 ฉันมีการสะท้อนกลับเหมือนเดิมเมื่อฉันเริ่มใช้ Stack Overflow แต่ในความเป็นจริงโพสต์สแต็คแลกเปลี่ยนอยู่ในหลาย ๆ วิธีที่ใกล้กับบทความ Wikipedia มากกว่าโพสต์บนฟอรัมสนทนา คุณคาดหวังว่าผู้คนจะอ่านโพสต์ในฟอรั่มในไม่ช้าหลังจากที่พวกเขาโพสต์ดังนั้นจึงมีเหตุผลที่จะมีข้อบ่งชี้ที่มองเห็นได้หากพวกเขาได้รับการแก้ไข แต่สมมุติว่ามีคนเห็นกระทู้นี้ในปี 2570: พวกเขาไม่สนใจว่าจะมีย่อหน้าอยู่ที่นั่นตั้งแต่ปี 2011 หรือเพิ่มเข้ามาในปี 2019
Gilles 'ดังนั้นหยุดความชั่วร้าย'

11

คุณสามารถกู้คืนได้โดยไม่ต้องรีบูตเครื่องดังนั้นอย่ารีบูตจนกว่าคุณจะลองทำอย่างอื่นเพราะจะไม่สามารถบู๊ตได้ หากคุณยังเปิดเซสชัน SSH อยู่ให้ลองทำดังนี้:

  • ตำแหน่งที่โปรแกรมถูกเรียกใช้โดยใช้ตัวแปร $ PATH export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin"คุณสามารถเพิ่มสถานถังใหม่ของคุณไปยังเส้นทางโดยการเรียกใช้ คุณอาจต้องเพิ่มไดเรกทอรีsbin ที่เกี่ยวข้องเช่นกัน คุณยังสามารถเรียกใช้โปรแกรมด้วยตนเองผ่านเส้นทางแบบเต็ม/path/to/mv [from] [to]ตัวอย่างเช่นควรทำงานแม้ว่า mv จะอยู่ในตำแหน่งที่ต่างกัน ส่วนที่ยุ่งยากคือคำสั่งส่วนใหญ่จะต้องการเข้าถึงไลบรารีทั่วไปและคุณบอกว่า/libถูกย้ายดังนั้นคุณจำเป็นต้องตั้งค่าตัวแปรสำหรับตำแหน่งนั้นด้วยexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib

  • เมื่อคุณสามารถดำเนินการคำสั่งพื้นฐานให้ย้ายสิ่งต่าง ๆ กลับมา! mv /path/to/subfolder/* /จะอยู่ในลำดับ! เมื่อทุกอย่างกลับเข้าที่ระบบควรทำงานตามปกติ

หากล้มเหลวการบู๊ตใด ๆ LiveCD และการติดตั้งไดรฟ์ควรอนุญาตให้คุณย้ายโฟลเดอร์กลับไปยังตำแหน่งที่พวกเขาอยู่ คุณไม่จำเป็นต้องติดตั้งใหม่หรือใช้ distros livecd ของคุณเพียงแค่ติดตั้งไดรฟ์และย้ายโฟลเดอร์กลับไปยังตำแหน่งที่ถูกต้องบนดิสก์ ลินุกซ์ช่วยเหลือบนดิสก์จำนวนมากมีความเชี่ยวชาญในการให้เครื่องมือคอนโซลพื้นฐานเพียงไม่กี่อย่างให้คุณซ่อมแซมชนิดนี้


การทำงานผ่าน SSH ล้มเหลวฉันจึงดาวน์โหลด liveCD และฉันพยายามทำให้สิ่งต่าง ๆ ใช้งานได้ ฉันกำลังด้วงและพยายามที่จะติดตั้งไดรฟ์ แต่จะไม่ให้ฉันเพราะเคอร์เนลไม่ได้โหลด และการไม่สามารถมองเห็นเส้นทางที่แน่นอนของเส้นทางที่มีอยู่ทำให้เห็นได้ชัดว่าเป็นเรื่องยาก ...
Menelaos

1
บูตเพื่อถ่ายทอดสดติดดิสก์ของคุณย้ายสิ่งต่าง ๆ กลับไปยังที่ที่เหมาะสมรีบูตระบบของคุณ ... และขอให้โชคดี
Caleb

2
มันไม่พอที่จะตั้งคุณยังต้องเรียกรถตักดินแบบไดนามิกอย่างชัดเจนเช่นLD_LIBRARY_PATH LD_LIBRARY_PATH=/newpath/to/lib /newpath/to/lib/ld-linux.so.2 /newpath/to/bin/mv
Gilles 'หยุดชั่วร้าย'

4

คุณควรจะสามารถรีบูทคอมพิวเตอร์ด้วยแผ่นซีดีติดตั้งในโหมดผู้ใช้คนเดียวเมานต์ระบบไฟล์รูทและย้ายไฟล์กลับมาบน Linux ฉันไม่รู้จัก centos มากนัก แต่มันเหมือน RHEL ดังนั้นมันน่าจะใช้ได้


ขอบคุณฉันกำลังดาวน์โหลดในขณะที่เราพูด มันสร้างความแตกต่างถ้ามันเป็นซีดีสดหรือดีวีดีการติดตั้งทั้งหมดหรือไม่
Menelaos

@Menelaos: คุณไม่ต้องการติดตั้งคุณต้องการบางสิ่งบางอย่างที่คุณสามารถเรียกใช้สดสำหรับวิธีนี้ ดิสก์การติดตั้งบางรุ่นมีรุ่นที่ใช้งานอยู่ แต่บางรุ่นก็ต้องการที่จะไม่ติดทันที บางโหมดมีโหมด "กู้ภัย" ซึ่งเป็นสิ่งที่คุณต้องการจริง ๆ แต่ก็มีดิสก์ช่วยเหลือของลินุกซ์โดยเฉพาะ มันไม่จำเป็นต้องเป็น distro ของคุณ แต่มันจะต้องเป็นสิ่งที่สามารถติดตั้งระบบไฟล์ linux และย้ายโฟลเดอร์กลับมาได้ ดูคำตอบของฉัน
Caleb

ดูsysresccd.orgเพื่อดูแผ่นซีดีช่วยเหลือหากคุณต้องการมีเอกสารที่ครอบคลุมเพื่อดูวิธีการใช้งาน ช่วยในการใช้เพื่อแก้ไขปัญหานี้อาจเป็นเรื่องยากในฟอรัมนี้และเกินเวลาที่ฉันมี มิฉะนั้นซีดี centos น่าจะช่วยได้ ซีดีสดล่าสุดอาจทำงานได้หรือไม่ ... ดังนั้นเมื่อคำนึงถึงปัญหาเหล่านี้คุณควรเก็บสื่อการติดตั้ง / iso ของรุ่นที่คุณติดตั้งไว้เสมอ สร้างการสำรองข้อมูลของระบบไฟล์ทั้งหมด
Jamess

2

ขอบคุณ Gilles เป็นอย่างมาก 5 ปีต่อมาและโพสต์ของคุณยังคงบันทึกวันของฉันถ้าไม่ใช่สัปดาห์

ฉันตั้งใจจะย้ายเนื้อหาของโฟลเดอร์ย่อยไปยังโฟลเดอร์ปัจจุบัน แต่แทนที่จะเป็นmv sub/* .ฉันก็mv sub /* .เลยย้ายทุกอย่างไปยังโฟลเดอร์ปัจจุบัน โชคดีที่ฉันพบคำตอบนี้และสามารถซ่อมแซมเครื่องของฉันได้อย่างง่ายดาย อย่างไรก็ตามฉันต้องปรับคำสั่งเล็กน้อยเนื่องจากฉันทำงานบนเครื่อง x86_64 ที่ใช้ Ubuntu 16.04 ฉันต้องการออกจากคำแนะนำที่นี่ในกรณีที่มีคนกำลังดิ้นรน:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/x86_64-linux-gnu
/oops/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /

0

ฉันต้องการเพิ่มคำสั่งอีกสองสามคำสั่งให้ทำหลังจากที่คุณใช้ คำตอบของ Ktiprสำหรับระบบที่ทันสมัย ​​(เครื่อง x86_64 ที่ใช้ระบบปฏิบัติการ Unix) ฉันไม่สามารถรับไดเรกทอรี "ฯลฯ " ถูกย้ายด้วย mv เพราะมันแสดงข้อผิดพลาด

Error : Directory not empty

ดังนั้นฉันต้องใช้

rsync -a source_file target_location

เพื่อให้แน่ใจว่าฉันสามารถรับทุกสิ่งกลับคืนได้อย่างเป็นระเบียบ หากคุณยังไม่ได้ติดตั้งคุณจะต้องติดตั้งก่อน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.