Как восстановить с 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 с крошечным сердечником под рукой. Полезно, когда что-то подобное происходит.
сага

Ответы:

28

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

Поскольку ваша испорченная файловая система находится в виртуальной машине, ваша хост-система должна быть доступна и работать. Смонтируйте свою сломанную файловую систему и исправьте ее.

В случае QEMU / KVM вы можете, например, смонтировать файловую систему, используя nbd .

Михась
источник
Я думаю, что это, вероятно, правильно, как способ исправить это, однако мне нужно попытаться смонтировать систему - сейчас я просто получаю предварительную систему из файла образа - как в initrd.img memtest & abi.
Jett
1
@jett, вы смонтировали /bootраздел этой виртуальной машины. Попробуйте найти корневую файловую систему. Если на LVM, запустить vgchange -ayпосле подключения, nbdчтобы активировать его.
Стефан Шазелас
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 мог дать вам оболочку после монтирования корневой файловой системы (только для чтения). хотя)). Или загрузите вашу виртуальную машину из образа живого компакт-диска, или исправьте, смонтировав файловую систему виртуальной машины на хосте, как предлагали другие.

Исправление пути 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случае: загрузиться на live CD, смонтировать rw раздел, содержащий / bin, и chmod 755 /bin(и файлы внутри, если они тоже были изменены). Но после этого убедитесь, что все файлы имеют правильное разрешение (в зависимости от вашего дистрибутива linux, вы, вероятно, можете проверить / bin на соответствие оригинальному пакету)
Olivier Dulac
4
ВАУ. Ваша глубина знаний страшна 8-).
slm
Я не могу использовать ld.so для выполнения. pb.abhijeetr.com/fRWf Что здесь не так?
Абхиджит Растоги
@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
>>> 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 и перед выключением системы.
Кен Беллоуз
0

Вы можете попробовать sudo chmod -R 744 /path-to-your-system/binиз живого дистрибутива.

Эркин Алп Гюней
источник