¿Cómo recuperarse de un chmod -R 000 / bin?

36

Y ahora no puedo volver a modificarlo ni usar ninguno de mis otros programas del sistema. Afortunadamente, esto está en una máquina virtual con la que he estado jugando, pero ¿hay alguna forma de resolver esto? El sistema es Ubuntu Server 12.10.

He intentado reiniciar en modo de recuperación, desafortunadamente ahora no puedo iniciar en absoluto en el sistema debido a los permisos que no otorgan algunos programas después de la disponibilidad de inicio inferior para ejecutar, el sistema simplemente se bloquea. Esto es lo que veo:

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

Después de esto, la computadora se cuelga.

jett
fuente
¿ /binEstá chmoded o los archivos en /bino ambos?
Stéphane Chazelas
1
el directorio / bin con la opción -R ... ambos
jett
Es bueno tener un usb con tinycore a mano. Útil cuando sucede algo como esto.
saga

Respuestas:

28

Inicie otro sistema operativo limpio, monte el sistema de archivos y corrija los permisos.

A medida que su sistema de archivos roto vive en una VM, debe tener su sistema host disponible y funcionando. Monta tu sistema de archivos roto allí y arréglalo.

En el caso de QEMU / KVM, por ejemplo, puede montar el sistema de archivos usando nbd .

michas
fuente
Creo que esto probablemente sea correcto como una forma de solucionarlo, sin embargo, necesito tratar de montar el sistema, en este momento solo estoy obteniendo el presistema del archivo de imagen, como en initrd.img memtest & abi.
jett
1
@jett, montaste la /bootpartición de esa VM. Intenta localizar el sistema de archivos raíz. Si está en LVM, ejecútelo vgchange -aydespués de conectarlo nbdpara activarlo.
Stéphane Chazelas 01 de
1
@StephaneChazelas Lo tengo. Muchas gracias a los dos. Me encantan este tipo de errores, ¡he aprendido muchísimo!
jett
Me alegro de que esté arreglado. Me falta algo Si es una máquina virtual, entonces es solo un archivo grande para el sistema host, ¿no? ¿Cómo se monta algo dentro para hacer las reparaciones? (Entiendo cómo hacer esto en un sistema que no sea VM).
Joe
68

Aun así root, no puede ejecutar archivos que no tengan establecido un xbit de permiso. Sin embargo, lo que puede hacer es invocarlo ld.so(siempre que sean ejecutables vinculados dinámicamente):

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

Utilice el que coincida con la arquitectura del chmodejecutable. En mi caso el x86_64uno:

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

O llamar a algo /usr/bin o en otro lugar para hacer el chmodcomo perl:

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

Tenga cuidado al restaurar permisos de que algunos archivos tienen me /bingusta mounto suestán destinados a tener permisos distintos de 0755.

Sin embargo, si ha reiniciado, es posible que no pueda llegar al punto en el que pueda ejecutar perlold.so no. Sin initramfsembargo, puede arreglar las cosas (pase un directorio raíz incorrecto para obtener un shell de recuperación en initramfs; consulte también el parámetro break=bottomo break=initkernel en Debian, para que initramfs le proporcione un shell después de que se haya montado el sistema de archivos raíz (solo lectura) aunque)). O inicie su VM desde una imagen de CD en vivo, o corríjalo montando el sistema de archivos de VM en el host como otros sugirieron.

Arreglando la forma initramfs:

En grub, edite la entrada de arranque y elimine el root=parámetro del 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-Xarrancar. Los initramfs de Ubuntu no encontrarán el sistema de archivos raíz, así que comienza una recuperación sh. Luego monte el sistema de archivos raíz (en mi caso /dev/vdb, adáptese a su máquina) y arregle las cosas allí:

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

Una vez arrancado, corrija los permisos de los archivos que no deben tener 755 permisos comparándolos con otro sistema.

Fijación ejecutando pythoncomo init:

En grub, editar la entrada de inicio, esta vez a mantener el root=parámetro, cambiar roa rwy añadir un 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                                 

Luego, en el indicador de 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

Nuevamente, una vez arrancado, corrija los permisos de los archivos que no deben tener 755 permisos comparándolos con otro sistema.

Stéphane Chazelas
fuente
55
+1, otra gran respuesta, Stephane. Agregaría: en el already try to rebootcaso: arranque en un CD en vivo, monte rw la partición que contiene / bin, y chmod 755 /bin(y archivos dentro si también se cambiaron). Pero luego, verifique que todos los archivos tengan el permiso correcto (dependiendo de su distribución de Linux, probablemente pueda verificar / bin con el paquete original)
Olivier Dulac
44
GUAU. Tu profundidad de conocimiento da miedo 8-).
slm
No puedo usar ld.so para ejecutar. pb.abhijeetr.com/fRWf ¿Qué está pasando aquí?
Abhijeet Rastogi
@shadyabhi, probablemente tenga un sistema multiarch y esté tratando de usar el ld.so de 32 bits en un ejecutable de 64 bits. Debe tener otro ld.so, tal vez en algún directorio como /lib/x86_64-linux-gnu.
Stéphane Chazelas
1
@Kwpolska, os.execly execson para ejecutar, no bifurcan un proceso, simplemente reemplazan el ejecutable en el mismo proceso , por lo que todo se hace en pid 1. El proceso 1 se ejecuta inicialmente python, luego sh, luego init.
Stéphane Chazelas
8

Utiliza python :)

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

Eso no debería necesitar nada /binpara hacer su trabajo. Obviamente, no he probado esto ...

Dennis Kaarsemaker
fuente
Hmm, siempre pensé que este y otros lenguajes de script simplemente llamarían al programa chmod. Bastante bueno saberlo!
jett
1
No, chmodes una llamada al sistema, llamada por el chmodprograma y también por la chmodfunción en python / perl / ruby, etc. Sin chmodembargo, los shells sí llaman a la utilidad.
Dennis Kaarsemaker 01 de
2
Excepto aquellas conchas que tienen chmodincorporado. Ese es el tipo de situación en la que las conchas sashson útiles. Está estáticamente vinculado y tiene la mayoría de los comandos de recuperación como chmodincorporado (por lo que no se basa en nada más). Por lo general, se sentaría /sbinaunque no dañaría tener copias adicionales en todos los sistemas de archivos, y se puede usar en combinación con memlockd. zshy ksh93tiene un chmod incorporado (aunque no está habilitado de forma predeterminada).
Stéphane Chazelas 01 de
1
@ Dennis Pero, ¿cómo puede ejecutarlo si no puede iniciar el sistema en absoluto? Como dice el OP: «lamentablemente ahora no puedo iniciar el sistema en absoluto».
Nadir Sampaoli
@NadirSampaoli Esta es definitivamente una de esas cosas que necesita atrapar antes de reiniciar. Esto podría hacerse con éxito después de chmodding root y antes de apagar el sistema.
Ken Bellows
0

Puedes probar sudo chmod -R 744 /path-to-your-system/bindesde una distribución en vivo.

Erkin Alp Güney
fuente