Come recuperare da un chmod -R 000 / bin?


36

E ora non sono in grado di ricodificarlo .. o utilizzare nessuno dei miei altri programmi di sistema. Fortunatamente questo è su una VM con cui ho giocato, ma c'è un modo per risolverlo? Il sistema è Ubuntu Server 12.10.

Ho tentato di riavviare in modalità di ripristino, sfortunatamente ora non riesco affatto ad avviare il sistema a causa delle autorizzazioni che non concedono alcuni programmi dopo la disponibilità di init-bottom per l'esecuzione: il sistema si blocca. Questo è quello che vedo:

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

Dopo questo il computer si blocca.


È /binchmoded o i file in /bino entrambi?
Stéphane Chazelas,

1
la directory / bin con l'opzione -R ... entrambi
jett

Va bene tenere a portata di mano un usb con tinycore. Utile quando succede qualcosa del genere.
saga,

Risposte:


28

Avviare un altro sistema operativo pulito, montare il file system e correggere le autorizzazioni.

Dato che il tuo file system danneggiato vive in una macchina virtuale, dovresti avere il tuo sistema host disponibile e funzionante. Installa lì il tuo file system rotto e correggilo.

Nel caso di QEMU / KVM, ad esempio, è possibile montare il file system usando nbd .


Penso che questo sia probabilmente un modo corretto per risolverlo, tuttavia, devo provare a montare il sistema - in questo momento sto solo ottenendo il presystem dal file di immagine - come in initrd.img memtest & abi.
jett

1
@jett, hai montato la /bootpartizione di quella VM. Prova a individuare il file system di root. Se su LVM, eseguire vgchange -aydopo aver collegato il nbdper attivarlo.
Stéphane Chazelas,

1
@StephaneChazelas Ce l'ho. Grazie a entrambi, adoro questo tipo di errori, ho imparato tantissimo!
jett

Sono contento che sia risolto. Mi manca qualcosa. Se è un VM, allora è solo un grosso file per il sistema host, non è vero? Come monti qualcosa al suo interno per fare le riparazioni? (Capisco come farlo su un sistema non VM.)
Joe

68

Anche così root, non è possibile eseguire file senza xbit di autorizzazione impostati. Quello che puoi fare è chiamarlo ld.so(a condizione che siano eseguibili collegati dinamicamente):

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

Usa quello che corrisponde all'architettura chmoddell'eseguibile. Nel mio caso x86_64quello:

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

O chiama qualcosa in /usr/bino altrove per fare il chmodsimile perl:

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

Prestare attenzione quando si ripristinano le autorizzazioni che alcuni file /binapprezzano mounto sudevono avere autorizzazioni diverse da 0755.

Se hai riavviato, tuttavia, potresti non essere in grado di arrivare al punto in cui è possibile eseguire perlo ld.socomunque. Puoi risolvere le cose dal initramfspensiero (passa una directory root errata per ottenere una shell di ripristino in initramfs; vedi anche il parametro break=bottomo break=initkernel su Debian, affinché initramfs ti dia una shell dopo che il file system root è stato montato (sola lettura anche se)). O avvia la tua VM da un'immagine di CD live o correggi montando il file system VM sull'host come altri hanno suggerito.

Correzione del modo initramfs:

In grub, modifica la voce di avvio e rimuovi il root=parametro dal 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-Xavviare. Gli initramfs di Ubuntu non troveranno il file system di root, quindi avvia un ripristino sh. Quindi montare il filesystem di root (nel mio caso /dev/vdb, adattarsi alla propria macchina) e sistemare le cose 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

Una volta avviato, correggi le autorizzazioni dei file che non devono avere 755 autorizzazioni confrontandole con un altro sistema.

Riparando eseguendo pythoncome init:

In grub, modifica la voce di avvio, questa volta mantieni il root=parametro, modifica roin rwe aggiungi 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                                 

Quindi, al prompt di 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

Ancora una volta, una volta avviato, correggi le autorizzazioni dei file che non sono pensati per avere 755 autorizzazioni confrontandole con un altro sistema.


5
+1, un'altra grande risposta, Stephane. Aggiungerei: nel already try to rebootcaso: avvia un CD live, monta rw la partizione contenente / bin e chmod 755 /bin(e i file all'interno se anch'essi sono stati modificati). Ma in seguito, controlla che tutti i file siano i permessi giusti (a seconda della tua distribuzione Linux, probabilmente puoi controllare / bin con il pacchetto originale)
Olivier Dulac,

4
WOW. La tua profondità di conoscenza è spaventosa Cool.
slm

Non posso usare ld.so per eseguire. pb.abhijeetr.com/fRWf Cosa non va qui?
Abhijeet Rastogi il

@shadyabhi, probabilmente hai un sistema multiarch e stai provando a usare ld.so a 32 bit su un eseguibile a 64 bit. Devi averne un altro ld.so, magari in una directory come /lib/x86_64-linux-gnu.
Stéphane Chazelas,

1
@Kwpolska, os.execle execsono per l'esecuzione, non eseguono il fork di un processo, sostituiscono semplicemente l'eseguibile nello stesso processo , quindi tutto viene eseguito in pid 1. Il processo 1 inizialmente viene eseguito python, quindi sh, quindi init.
Stéphane Chazelas,

8

Usa Python :)

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

Non dovrebbe aver bisogno di nulla /binper fare il suo lavoro. Ovviamente, non l'ho provato ...


Hmm, ho sempre pensato che questo e altri linguaggi di scripting avrebbero semplicemente chiamato il programma chmod. Abbastanza buono da sapere!
jett

1
No, chmodè una chiamata di sistema, chiamata dal chmodprogramma e anche dalla chmodfunzione in python / perl / ruby ​​ecc. Le shell chiamano comunque l' chmodutilità.
Dennis Kaarsemaker,

2
Tranne quelle shell che hanno chmodincorporato. Questo è il tipo di situazione in cui le conchiglie simili sashsono utili. È staticamente collegato e ha la maggior parte dei comandi di ripristino come chmodincorporato (quindi non si basa su nient'altro). Di solito rimarrebbe dentro /sbinanche se non danneggerebbe avere copie extra su tutti i file system e può essere usato in combinazione con memlockd. zshe ksh93ha un chmod incorporato (anche se non abilitato per impostazione predefinita).
Stéphane Chazelas,

1
@Dennis Ma come puoi eseguirlo se non riesci ad avviare il sistema? Come dice l'OP: «sfortunatamente ora non riesco affatto ad avviare il sistema».
Nadir Sampaoli,

@NadirSampaoli Questa è sicuramente una di quelle cose che devi catturare prima di riavviare. Questo potrebbe essere fatto con successo dopo aver scelto root e prima di spegnere il sistema.
Ken Bellows,

0

Puoi provare sudo chmod -R 744 /path-to-your-system/binda una distribuzione dal vivo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.