Como recuperar de um chmod -R 000 / bin?

36

E agora não consigo fazer o chmod de volta .. ou usar qualquer um dos meus outros programas de sistema. Felizmente, isso está em uma VM com a qual estive brincando, 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 o sistema devido a permissões que não concedem alguns programas após a disponibilidade do init-bottom para executar - o sistema simplesmente trava. Isto é 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.

Jett
fonte
É /binvocê chmoded ou os arquivos /binou ambos?
Stéphane Chazelas
1
o diretório / bin com a opção -R ... ambos
jett
É bom manter um usb com tinycore à mão. Útil quando algo assim acontece.
Saga

Respostas:

28

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

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

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

michas
fonte
Eu acho que isso provavelmente está correto como uma maneira de corrigi-lo, no entanto, preciso tentar montar o sistema - agora estou apenas obtendo o pré-sistema do arquivo de imagem - como em initrd.img memtest & abi.
Jett
1
@ jett, você montou a /bootpartição dessa VM. Tente e localize o sistema de arquivos raiz. Se estiver no LVM, execute vgchange -aydepois de conectar o nbdpara ativá-lo.
Stéphane Chazelas
1
@StephaneChazelas Eu entendi. Muito obrigado a vocês- Eu amo esse tipo de erro, aprendi muito!
Jett
Ainda bem que está consertado. Estou sentindo falta de algo. Se é um vm, é apenas um arquivo grande para o sistema host, não é? Como você monta algo dentro dele para fazer os reparos? (Eu entendo como fazer isso em um sistema não-vm.) #
317 Joe Joe
68

Mesmo assim root, você não pode executar arquivos sem xbits de permissão definidos. O que você pode fazer é chamá ld.so-lo (desde que sejam executáveis ​​vinculados dinamicamente):

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

Use aquele que corresponde à arquitetura do chmodexecutável. No meu caso, o seguinte x86_64:

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

Ou ligue para algo em /usr/binou em outro lugar para fazer o chmodcomo perl:

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

Cuidado ao restaurar permissões que alguns arquivos /bingostam mountou sudevem ter permissões diferentes de 0755.

Se você reiniciou, no entanto, talvez não seja capaz de chegar ao ponto em que pode executar perlou, no ld.soentanto. Você pode consertar as coisas do initramfsporém (passe um diretório raiz incorreto para obter um shell de recuperação no initramfs; veja também o parâmetro break=bottomou break=initkernel no Debian, para o initramfs fornecer um shell depois que o sistema de arquivos raiz foi montado (somente leitura) Apesar)). Ou inicialize sua VM a partir de uma imagem de CD ativo ou corrija montando o sistema de arquivos da VM no host, conforme sugerido por outros.

Corrigindo a maneira initramfs:

Em grub, edite a entrada de inicialização e remova o root=parâmetro do linuxcomando:

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-Xpara inicializar. O initramfs do Ubuntu não encontra o sistema de arquivos raiz, então inicie uma recuperação sh. Em seguida, 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

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

Correção executando pythoncomo init:

Em grub, edite a entrada de inicialização, desta vez mantenha o root=parâmetro, altere ropara rwe 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                                 

Em seguida, 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.

Stéphane Chazelas
fonte
5
+1, outra ótima resposta, Stephane. Eu adicionaria: no already try to rebootcaso: inicialize em um CD ao vivo, monte rw a partição que contém / bin e chmod 755 /bin(e arquivos dentro se eles também foram alterados). Mas depois, verifique se todos os arquivos são a permissão para a direita (dependendo do seu distrib linux, você provavelmente pode verificar / bin contra o pacote original)
Olivier Dulac
4
UAU. Sua profundidade de conhecimento é assustadora 8-).
slm
Não consigo usar o ld.so para executar. pb.abhijeetr.com/fRWf O que está acontecendo de errado aqui?
Abhijeet Rastogi
@ shadyabhi, você provavelmente tem um sistema multiarch e está tentando usar o 32bit ld.so em um executável de 64 bits. Você deve ter outro ld.so, talvez em algum diretório como /lib/x86_64-linux-gnu.
Stéphane Chazelas
1
@Kwpolska, os.execle execsão para execução, eles não bifurcam um processo, apenas substituem o executável no mesmo processo , para que tudo seja feito no pid 1. O processo 1 é executado inicialmente e python, em seguida sh, então init.
Stéphane Chazelas
8

Use python :)

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

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

Dennis Kaarsemaker
fonte
Hmm, eu sempre imaginei que essa e outras linguagens de script chamariam o programa chmod. Muito bom saber!
Jett
1
Não, chmodé uma chamada do sistema, chamada pelo chmodprograma e também pela chmodfunção em python / perl / ruby ​​etc. shells chamam o chmodutilitário.
Dennis Kaarsemaker
2
Exceto as conchas que foram chmodconstruídas. Esse é o tipo de situação em que conchas como sashsão úteis. Ele está vinculado estaticamente e possui a maioria dos comandos de recuperação como o chmodbuiltin (portanto, não depende de mais nada). Ele geralmente fica /sbinparado, embora não prejudique a obtenção de cópias extras em todos os sistemas de arquivos e pode ser usado em combinação com o memlockd. zshe ksh93tenha um chmod embutido (embora não esteja ativado por padrão).
Stéphane Chazelas
1
@ Dennis Mas como você pode executá-lo se não consegue inicializar o sistema? Como o OP diz: "infelizmente agora não consigo inicializar o sistema".
Nadir Sampaoli
@NadirSampaoli Essa é definitivamente uma daquelas coisas que você precisa capturar antes de reiniciar. Isso pode ser feito com êxito após chmodding root e antes de desligar o sistema.
precisa
0

Você pode tentar sudo chmod -R 744 /path-to-your-system/binem uma distribuição ao vivo.

Erkin Alp Güney
fonte