Як відновити з chmod -R 000 / bin?


36

І тепер я не можу chmod це повернути .. або використовувати будь-яку з інших моїх системних програм. На щастя, це на ВМ, з яким я бавився, але чи є спосіб вирішити це? Система - 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або обох?
Стефан Шазелас

1
каталог / bin з опцією -R ... обидва
jett

Добре тримати під рукою usb з tinycore. Корисно, коли щось подібне відбувається.
сага

Відповіді:


28

Завантажте ще одну чисту ОС, встановіть файлову систему та виправте дозволи.

Оскільки ваша зламана файлова система живе у вітчизняній машині, ви повинні мати вашу хост-систему в наявності та працювати. Встановіть там свою зламану файлову систему та виправте її.

У випадку QEMU / KVM ви можете, наприклад, змонтувати файлову систему за допомогою nbd .


Я думаю, що це, мабуть, правильно як спосіб виправити це, однак, мені потрібно спробувати встановити систему - зараз я просто отримую пресистему з файлу зображень - як у initrd.img memtest & abi.
jett

1
@jett, ти змонтував /bootрозділ цього VM. Спробуйте знайти локальну файлову систему. Якщо на LVM, запустіть vgchange -ayпісля підключення, nbdщоб активувати його.
Stéphane Chazelas

1
@StephaneChazelas У мене це є. Дякую вам обом - я люблю подібні помилки, навчився тон!
jett

Радий, що це виправлено. Я щось пропускаю. Якщо це vm, то це лише один великий файл в хост-системі, чи не так? Як ви монтуєте що-небудь всередині нього, щоб зробити ремонт? (Я розумію, як це зробити в системі, яка не працює в vm.)
Джо

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 з прямого CD-зображення, або виправляйте, встановивши файлову систему 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 Ubuntu не знайде кореневої файлової системи, тому починайте відновлення 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                                 

Потім у запиті python:

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, ще одна чудова відповідь, Стефане. Додаю: у already try to rebootвипадку: завантажуйтесь на живий компакт-диск, монтуйте rw на розділ, що містить / bin, та chmod 755 /bin(і файли всередині, якщо вони теж були змінені). Але згодом перевірте, чи всі файли є правильним дозволом (залежно від вашого дистрибутива linux, ви, ймовірно, можете перевірити / бен в порівнянні з оригінальним пакетом)
Олів'є Дулак

4
ОГО. Ваша глибина знань страшна 8-).
slm

Я не можу використовувати ld.so для виконання. pb.abhijeetr.com/fRWf Що тут не так?
Abhijeet Rastogi

@shadyabhi, напевно, у вас є багатоархова система і ви намагаєтесь використовувати 32-бітний ld.so на 64-бітному виконуваному файлі. У вас повинен бути інший ld.so, можливо, в якомусь подібному каталозі /lib/x86_64-linux-gnu.
Стефан Шазелас

1
@Kwpolska, os.execlі execвони призначені для виконання, вони не розщеплюють процес, просто замінюють виконуваний файл тим самим процесом , так що все робиться в pid 1. Процес 1 спочатку запускається python, потім sh, потім init.
Стефан Шазелас

8

Використовуйте python :)

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

Тоді нічого не потрібно, /binщоб виконувати свою роботу. Очевидно, я цього не пробував ...


Хм, я завжди вважав, що ця та інші мови сценаріїв просто називатимуть програму chmod. Досить добре знати!
jett

1
Ні, chmodце системний виклик, який викликається chmodпрограмою, а також chmodфункцією в python / perl / ruby ​​і т.д. оболонки дійсно викликають chmodутиліту.
Денніс Каарсемейкер

2
За винятком тих снарядів, які були chmodвбудовані. Ось така ситуація, коли sashкорисні снаряди корисні. Він статично пов'язаний і має більшість команд відновлення, як chmodвбудований (тому не покладається ні на що інше). Зазвичай він сидить, /sbinхоча це не завадить мати зайві копії у всіх файлових системах, і їх можна використовувати в поєднанні з memlockd. zshі ksh93мають вбудований chmod (хоча за умовчанням він не включений).
Стефан Шазелас

1
@Dennis Але як це можна запустити, якщо ви взагалі не можете завантажуватися в систему? Як говорить ОП: «На жаль, зараз я взагалі не в змозі завантажуватися в систему».
Надір Сампаоолі

@NadirSampaoli Це, безумовно, одна з тих речей, яку потрібно зловити перед перезавантаженням. Це можна успішно зробити після chmodding root та перед вимкненням системи.
Кен Беллоуз

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.