Como recuperar de um chmod -R 000 / bin?

32

E agora eu não consigo voltar atrás ou usar qualquer um dos meus outros programas do sistema. Felizmente isso está em uma VM com a qual tenho andado a brincar, mas existe alguma maneira de resolver isso? O sistema é o Ubuntu Server 12.10.

Eu tentei reiniciar no modo de recuperação, infelizmente agora não consigo inicializar no sistema devido a permissões que não concedem alguns programas depois que a disponibilidade do init-bottom é executada - o sistema simplesmente trava. Isso é o que eu vejo:

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

Depois disso, o computador trava.

    
por jett 01.06.2013 / 07:03

4 respostas

25

Inicialize outro SO limpo, monte o sistema de arquivos e corrija as permissões.

Como seu sistema de arquivos quebrado mora em uma VM, você deve ter seu sistema host disponível e funcionando. Monte seu sistema de arquivos quebrado e corrija-o.

No caso do QEMU / KVM você pode, por exemplo, montar o sistema de arquivos usando nbd .

    
por 01.06.2013 / 08:46
65

Mesmo como root , você não pode executar arquivos que não tenham nenhum bit de permissão x definido. O que você pode fazer é chamar ld.so (desde que sejam executáveis vinculados dinamicamente):

sudo /lib/*/ld*.so /bin/chmod 755 /bin /bin/chmod

Ou ligue para algo em /usr/bin ou em outro lugar para fazer o chmod like perl :

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

Tenha cuidado ao restaurar permissões em que alguns arquivos em /bin , como mount ou su , devem ter permissões diferentes de 0755.

Se você reiniciou, no entanto, talvez não consiga chegar ao ponto em que pode executar perl ou ld.so . Você pode consertar coisas do initramfs (passe um diretório raiz incorreto para obter um shell de recuperação no initramfs). Ou inicialize sua VM a partir de uma imagem de CD ao vivo ou corrija montando o sistema de arquivos da VM no host, como os outros sugeriram.

Corrigindo o caminho do initramfs:

Em grub , edite a entrada de inicialização e remova o parâmetro root= do comando 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 para inicializar. O initramfs do Ubuntu não encontrará o sistema de arquivos raiz, portanto, inicie uma recuperação sh . Então monte o sistema de arquivos raiz (no meu caso /dev/vdb , adapte-se à sua máquina) e corrija as coisas lá:

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

Uma vez inicializado, corrija as permissões dos arquivos que não devem ter 755 permissões comparando com outro sistema.

Corrigindo executando python como init :

Em grub , edite a entrada de inicialização, desta vez mantenha o parâmetro root= , altere ro para rw e adicione um 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                                 

Então, no prompt do 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

Novamente, uma vez inicializado, corrija as permissões dos arquivos que não devem ter 755 permissões comparando com outro sistema.

    
por 01.06.2013 / 09:00
8

Use python:)

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

Isso não precisa de nada de /bin para fazer seu trabalho. Obviamente, eu não tentei isso ...

    
por 01.06.2013 / 09:30
0

Você pode experimentar sudo chmod -R 744 /path-to-your-system/bin de uma distro ao vivo.

    
por 26.06.2013 / 18:52