วิธีการกู้คืนจาก chmod -R 000 / bin?


36

และตอนนี้ฉันไม่สามารถย้อนกลับไป .. หรือใช้โปรแกรมระบบอื่น ๆ ของฉัน โชคดีที่มันอยู่บน VM ที่ฉันเล่นด้วย แต่มีวิธีแก้ไขปัญหานี้หรือไม่? ระบบนี้เป็น Ubuntu Server 12.10

ฉันพยายามที่จะรีสตาร์ทในโหมดการกู้คืนโชคไม่ดีที่ตอนนี้ฉันไม่สามารถบูตเข้าสู่ระบบได้เลยเนื่องจากการอนุญาตไม่อนุญาตบางโปรแกรมหลังจากความพร้อมใช้งานของ init-bottom เพื่อเรียกใช้ - ระบบเพิ่งแฮงค์ นี่คือสิ่งที่ฉันเห็น:

Begin: Running /scripts/init-bottom ... done
[   37.062059] init: Failed to spawn friendly-recovery pre-start process: unable to execute: Permission denied
[   37.084744]  init: Failed to spawn friendly-recovery post-stop process: unable to execute: Permission denied
[   37.101333] init: plymouth main process (220) killed by ABRT signal

หลังจากนี้คอมพิวเตอร์จะหยุดทำงาน


มันเป็น/binคุณ chmoded หรือไฟล์ใน/binหรือทั้งสอง?
Stéphane Chazelas

1
ไดเรกทอรี / bin พร้อมตัวเลือก -R ... ทั้งคู่
jett

มันเป็นเรื่องดีที่จะเก็บ usb ไว้กับ tinycore มีประโยชน์เมื่อสิ่งนี้เกิดขึ้น
saga

คำตอบ:


28

บูตระบบใหม่อีกครั้งที่สะอาดติดตั้งระบบไฟล์และแก้ไขสิทธิ์

เนื่องจากระบบไฟล์ที่ใช้งานไม่ได้ของคุณอาศัยอยู่ใน VM คุณควรให้ระบบโฮสต์ของคุณพร้อมใช้งานและทำงานได้ ติดตั้งระบบไฟล์ที่ใช้งานไม่ได้ของคุณที่นั่นแล้วแก้ไข

ในกรณีของ QEMU / KVM คุณสามารถเช่นติดระบบไฟล์โดยใช้NBD


ฉันคิดว่านี่อาจเป็นวิธีที่ถูกต้องในการแก้ไขอย่างไรก็ตามฉันต้องพยายามติดตั้งระบบ - ตอนนี้ฉันเพิ่งได้รับ presystem จากไฟล์ภาพ - ใน initrd.img memtest & abi
jett

1
@jett คุณได้ติดตั้ง/bootพาร์ติชันของ VM นั้น ลองและค้นหาระบบไฟล์รูท หากเป็น LVM ให้เรียกใช้vgchange -ayหลังจากเชื่อมต่อnbdเพื่อเปิดใช้งาน
Stéphane Chazelas

1
@ StephanChazelas ฉันเข้าใจแล้ว ขอบคุณทั้งคู่ - ฉันรักความผิดพลาดเหล่านี้ได้เรียนรู้มากมาย!
jett

ดีใจที่ได้รับการแก้ไข ฉันคิดถึงบางอย่าง หากเป็น vm แสดงว่าเป็นไฟล์ขนาดใหญ่เพียงไฟล์เดียวในระบบโฮสต์ใช่ไหม คุณติดตั้งอะไรในนั้นเพื่อทำการซ่อมแซมได้อย่างไร (ฉันเข้าใจวิธีการทำเช่นนี้ในระบบที่ไม่ใช่ vm.)
Joe

68

แม้ว่าrootคุณจะไม่สามารถเรียกใช้ไฟล์ที่ไม่มีการxตั้งค่าบิตการอนุญาตได้ สิ่งที่คุณสามารถทำได้คือโทรหาld.so(หากมีการเชื่อมโยงไฟล์ที่เรียกใช้งานได้แบบไดนามิก):

$ echo /lib/*/ld*.so
/lib/i386-linux-gnu/ld-2.27.so /lib/x86_64-linux-gnu/ld-2.27.so

ใช้อันที่ตรงกับสถาปัตยกรรมของchmodปฏิบัติการ ในกรณีของฉันx86_64หนึ่ง:

sudo /lib/x86_64-linux-gnu/ld-2.27.so /bin/chmod 755 /bin /bin/chmod

หรือโทรหาบางอย่างใน/usr/binหรือที่อื่น ๆ เพื่อทำสิ่งที่chmodชอบperl:

sudo perl -e 'chmod 0755, "/bin", "/bin/chmod"

ระวังเมื่อกู้คืนสิทธิ์ที่บางไฟล์/binเหมือนmountหรือsuมีความหมายว่ามีสิทธิ์อื่นนอกเหนือจาก 0755

อย่างไรก็ตามหากคุณรีบูตเครื่องคุณอาจไม่สามารถไปถึงจุดที่คุณสามารถวิ่งperlหรือวิ่งld.soได้ คุณสามารถแก้ไขสิ่งต่าง ๆ ได้จากinitramfs(ผ่านไดเรกทอรีรากที่ไม่ถูกต้องเพื่อรับเชลล์กู้คืนใน initramfs ดูพารามิเตอร์break=bottomหรือbreak=initเคอร์เนลบน Debian เพื่อให้ initramfs ให้เชลล์หลังจากติดตั้งระบบไฟล์รูท (อ่านอย่างเดียว) แม้ว่า)) หรือบูต VM ของคุณจากอิมเมจซีดีสดหรือแก้ไขโดยติดตั้งระบบไฟล์ VM บนโฮสต์ตามที่คนอื่นแนะนำ

แก้ไขวิธี initramfs:

ในgrubแก้ไขรายการบูตและลบroot=พารามิเตอร์ออกจากlinuxคำสั่ง:

setparams 'Ubuntu, with Linux 3.2.0-27-generic'                          

recordfail                                                               
gfxmode $linux_gfx_mode                                                  
insmod gzio                                                              
insmod ext2                                                              
set root='(hd1)'                                                         
search --no-floppy --fs-uuid --set=root dc02b07c-88ef-4804-afe0-4f02db2\ 
94561                                                                    
linux /boot/vmlinuz-3.2.0-27-generic                                     
initrd /boot/initrd.img-3.2.0-27-generic                                 

Ctrl-Xเพื่อบูต initramfs shอูบุนตูจะไม่หาระบบแฟ้มรากเพื่อเริ่มต้นการกู้คืน จากนั้นติดตั้งระบบไฟล์รูท (ในกรณีของฉัน/dev/vdbปรับให้เข้ากับเครื่องของคุณ) และแก้ไขสิ่งต่าง ๆ ที่นั่น:

Target filesystem doesn't have requested /sbin/init.
No init found. Try passing init= bootarg.


BusyBox v1.18.5 (Ubuntu 1:1.18.5-1ubuntu4) built-in shell (ash)
Enter 'help' for a list of built-in commands.

(initramfs) mkdir /x
(initramfs) mount /dev/vdb /x
[   48.430071] EXT3-fs (vdb): error: couldn't mount because of unsupported optio
nal features (240)
[   48.477406] EXT4-fs (vdb): recovery complete
[   48.477747] EXT4-fs (vdb): mounted filesystem with ordered data mode. Opts: (
null)
(initramfs) chmod -R 755 /x/bin
(initramfs) umount /x
(initramfs) reboot

เมื่อบู๊ตแล้วแก้ไขสิทธิ์ของไฟล์ที่ไม่ได้มีไว้เพื่ออนุญาต 755 ไฟล์โดยเปรียบเทียบกับระบบอื่น

แก้ไขโดยเรียกใช้pythonเป็นinit:

ในgrubแก้ไขรายการบูตครั้งนี้ให้root=พารามิเตอร์การเปลี่ยนแปลงroไปrwและเพิ่มinit=/usr/bin/python:

setparams 'Ubuntu, with Linux 3.2.0-27-generic'                          

recordfail                                                               
gfxmode $linux_gfx_mode                                                  
insmod gzio                                                              
insmod ext2                                                              
set root='(hd1)'                                                         
search --no-floppy --fs-uuid --set=root dc02b07c-88ef-4804-afe0-4f02db2\ 
94561                                                                    
linux /boot/vmlinuz-3.2.0-27-generic root=UUID=dc02b07c-88ef-4804-afe0-\
4f02db294561 rw init=/usr/bin/python
initrd /boot/initrd.img-3.2.0-27-generic                                 

จากนั้นที่พร้อมรับคำหลาม:

Begin: Running /scripts/init-bottom ... done.
Python 2.7.3 (default, Apr 20 2012, 22:39:59)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.chmod('/bin/sh',0755)
>>> os.chmod('/bin/chmod',0755)
>>> os.execl('/bin/sh','sh')
sh: 0: can't access tty; job control turned off
# chmod -R 0755 /bin
# mount -o remount,ro /
[  100.704720] EXT4-fs (vdb): re-mounted. Opts: errors=remount-ro
# exec /sbin/init

อีกครั้งเมื่อบูตเครื่องให้แก้ไขการอนุญาตของไฟล์ที่ไม่ได้ตั้งใจให้มีการอนุญาต 755 โดยเปรียบเทียบกับระบบอื่น


5
+1 อีกคำตอบที่ดี Stephane ฉันจะเพิ่ม: ในalready try to rebootกรณี: บูตบนซีดีสดให้ติดพาร์ทิชัน rw ที่มี / bin และchmod 755 /bin(และไฟล์ภายในหากมีการเปลี่ยนแปลงด้วย) แต่หลังจากนั้นตรวจสอบว่าไฟล์ทั้งหมดจะได้รับอนุญาตจากทางขวา (ขึ้นอยู่กับการจัดแจกลินุกซ์ของคุณคุณอาจจะสามารถตรวจสอบ / bin กับแพคเกจเดิม)
โอลิเวีย Dulac

4
ว้าว. ความรู้เชิงลึกของคุณน่ากลัว 8-)
slm

ฉันไม่สามารถใช้ ld.so เพื่อดำเนินการได้ pb.abhijeetr.com/fRWfเกิดอะไรขึ้นที่นี่?
Abhijeet Rastogi

@shadyabhi คุณอาจมีหลายระบบและพยายามใช้ 32 บิต ld.so บน 64 บิตที่ปฏิบัติการได้ คุณต้องมีอีกบางทีในไดเรกทอรีบางอย่างเช่นld.so /lib/x86_64-linux-gnu
Stéphane Chazelas

1
@Kwpolska, os.execlและexecมีการดำเนินการที่พวกเขาไม่แยกกระบวนการเพียงแทนที่ปฏิบัติการในกระบวนการเดียวกันดังนั้นสิ่งที่จะทำใน pid 1. กระบวนการ 1 แรกวิ่งpythonแล้วแล้วsh init
Stéphane Chazelas

8

ใช้หลาม :)

$ python
>>> import os
>>> os.chmod('/bin', 0755)

ที่ไม่ควรต้องการอะไรจาก/binการทำงาน เห็นได้ชัดว่าฉันไม่ได้ลองสิ่งนี้ ...


อืมฉันคิดเสมอว่าสิ่งนี้และภาษาสคริปต์อื่น ๆ จะเรียกโปรแกรม chmod ค่อนข้างดีที่จะรู้!
jett

1
ไม่chmodคือการเรียกของระบบเรียกโดยchmodโปรแกรมและโดยchmodฟังก์ชันใน python / perl / ruby ​​ฯลฯ เชลล์จะเรียกchmodยูทิลิตีว่า
Dennis Kaarsemaker

2
ยกเว้นเปลือกหอยที่มีchmodอยู่ภายใน นั่นเป็นสถานการณ์ที่หอยsashมีประโยชน์ มันเชื่อมโยงแบบคงที่และมีคำสั่งการกู้คืนส่วนใหญ่เช่นchmodbuiltin (ดังนั้นไม่ต้องพึ่งพาสิ่งอื่นใด) มันมักจะนั่ง/sbinแม้ว่ามันจะไม่เป็นอันตรายต่อการมีสำเนาเพิ่มเติมในทุกระบบไฟล์และสามารถใช้ร่วมกับ memlockd zshและksh93มีตัวสร้าง chmod (แม้ว่าจะไม่ได้เปิดใช้งานโดยค่าเริ่มต้น)
Stéphane Chazelas

1
@Dennis แต่คุณจะเรียกใช้ได้อย่างไรถ้าคุณไม่สามารถบูตเข้าสู่ระบบได้เลย? ตามที่ OP กล่าวว่า:“ น่าเสียดายที่ตอนนี้ฉันไม่สามารถบูตเข้าสู่ระบบได้เลย»
ขีดตกต่ำสุดขั้ว Sampaoli

@NadirSampaoli นี่เป็นหนึ่งในสิ่งที่คุณต้องจับก่อนที่จะรีบูต สิ่งนี้สามารถทำได้สำเร็จหลังจากรูท chmodding และก่อนที่จะปิดระบบ
Ken Bellows

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