Comment récupérer d'un chmod -R 000 / bin?

36

Et maintenant, je suis incapable de le vérifier .. ou d’utiliser l’un de mes autres programmes système. Heureusement, c'est sur une machine virtuelle avec laquelle je m'amuse, mais y a-t-il un moyen de résoudre ce problème? Le système est Ubuntu Server 12.10.

J'ai essayé de redémarrer en mode de récupération, mais malheureusement, je ne parviens plus du tout à démarrer sur le système car des autorisations ne sont pas accordées à certains programmes après la disponibilité d'initial-bottom, le système se bloque. Voici ce que je vois:

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

Après cela, l'ordinateur se bloque.

jet
la source
Est-ce que /binvous chmoded ou les fichiers /binou les deux?
Stéphane Chazelas
1
le répertoire / bin avec l'option -R ... les deux
jett
C'est bien garder un usb avec tinycore à portée de main. Utile quand quelque chose comme ça arrive.
Saga

Réponses:

28

Démarrez un autre système d'exploitation vierge, montez le système de fichiers et corrigez les autorisations.

Étant donné que votre système de fichiers endommagé réside dans une machine virtuelle, votre système hôte doit être disponible et fonctionnel. Montez votre système de fichiers endommagé et corrigez-le.

Dans le cas de QEMU / KVM, vous pouvez par exemple monter le système de fichiers à l’aide de nbd .

michas
la source
Je pense que ceci est probablement correct comme solution, mais je dois essayer de monter le système - pour le moment, je récupère juste le système dans le fichier image - comme dans initrd.img memtest & abi.
Jett
1
@jett, vous avez monté la /bootpartition de cette machine virtuelle. Essayez de localiser le système de fichiers racine. Si sur LVM, exécutez vgchange -ayaprès avoir connecté le nbdpour l'activer.
Stéphane Chazelas
1
@ StephaneChazelas je l'ai. Merci beaucoup à vous deux - j'aime ce genre d'erreurs, j'en ai appris beaucoup!
jett
Heureux c'est réglé. Il me manque quelque chose. S'il s'agit d'une machine virtuelle, il ne s'agit que d'un seul gros fichier dans le système hôte, n'est-ce pas? Comment montez-vous quelque chose à l'intérieur pour effectuer les réparations? (Je comprends comment faire cela sur un système autre que vm.)
Joe
68

Même ainsi root, vous ne pouvez pas exécuter de fichiers pour lesquels aucun xbit d’autorisation n’a été défini. Ce que vous pouvez faire est cependant d’appeler ld.sodessus (à condition que ce soit des exécutables liés dynamiquement):

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

Utilisez celui qui correspond à l'architecture de l' chmodexécutable. Dans mon cas, x86_64celui:

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

Ou appelez quelque chose à l' /usr/binintérieur ou ailleurs pour faire ce qui chmodsuit perl:

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

Méfiez - vous des autorisations lors de la restauration que certains fichiers /bincomme mountou susont censés avoir des autorisations autres que 0755.

Cependant, si vous avez redémarré, vous ne pourrez peut-être pas atteindre le point où vous pouvez exécuter perlou ld.sobien. Vous pouvez corriger le problème depuis initramfs(passer un répertoire racine incorrect pour obtenir un shell de récupération dans initramfs; voir aussi le paramètre kernel du noyau break=bottomou break=initsur Debian pour que initramfs vous fournisse un shell après le montage du système de fichiers racine (en lecture seule)). bien que)). Ou démarrez votre machine virtuelle à partir d'une image de CD live, ou corrigez-la en montant le système de fichiers de la machine virtuelle sur l'hôte, comme suggéré par d'autres.

Correction de la manière initramfs:

Dans grub, éditez l'entrée de démarrage et supprimez le root=paramètre de la linuxcommande:

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-Xpour démarrer. Les initramfs d'Ubuntu ne trouveront pas le système de fichiers racine, lancez donc une récupération sh. Ensuite, montez le système de fichiers racine (dans mon cas /dev/vdb, adaptez-le à votre machine) et corrigez les problèmes:

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

Une fois démarré, corrigez les autorisations des fichiers qui ne sont pas censés avoir des autorisations 755 en les comparant à un autre système.

Fixation en cours d'exécution en pythontant que init:

Dans grub, modifier l'entrée de démarrage, cette fois garder le root=paramètre, le changement roà rwet ajouter 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                                 

Ensuite, à l’invite 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

Encore une fois, une fois démarré, corrigez les autorisations des fichiers qui ne sont pas censés avoir des autorisations 755 en les comparant à un autre système.

Stéphane Chazelas
la source
5
+1, une autre bonne réponse, Stéphane. J'ajouterais: dans le already try to rebootcas: démarrez sur un CD live, montez rw la partition contenant / bin, et chmod 755 /bin(et les fichiers qu'ils contiennent s'ils ont également été modifiés). Mais ensuite, vérifiez que tous les fichiers sont la bonne permission (en fonction de votre distribution linux, vous pouvez probablement vérifier / bin par rapport au paquet original)
Olivier Dulac
4
SENSATIONNEL. Votre profondeur de connaissance est effrayante 8-).
slm
Je ne peux pas utiliser ld.so pour exécuter. pb.abhijeetr.com/fRWf Qu'est-ce qui ne va pas ici?
Abhijeet Rastogi
@shadyabhi, vous avez probablement un système multiarch et essayez d'utiliser le fichier ld.so 32 bits sur un exécutable 64 bits. Vous devez en avoir un autre ld.so, par exemple dans un répertoire /lib/x86_64-linux-gnu.
Stéphane Chazelas
1
@Kwpolska, os.execlet execsont destinés à l'exécution, ils ne créent pas de processus, mais remplacent simplement l'exécutable dans le même processus , de sorte que tout se passe dans le pid 1. Le processus 1 s'exécute initialement python, puis sh, ensuite init.
Stéphane Chazelas
8

Utilisez python :)

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

Cela ne devrait avoir besoin de rien /binpour faire son travail. Évidemment, je n'ai pas essayé ça ...

Dennis Kaarsemaker
la source
Hmm, j'ai toujours pensé que cela et d'autres langages de script n'appelleraient que le programme chmod. Plutôt bon à savoir!
Jett
1
Non, chmodest un appel système, appelé par le chmodprogramme et également par la chmodfonction dans les shells python / perl / ruby, etc., appelle chmodnéanmoins l' utilitaire.
Dennis Kaarsemaker
2
Sauf les coquilles qui ont chmodconstruit. C'est le genre de situation où les coquilles sashsont utiles. Il est lié statiquement et a la plupart des commandes de récupération similaires à celles chmodintégrées (donc ne repose sur rien d’autre). Il resterait normalement en place /sbinmême s'il ne serait pas dommageable d'avoir des copies supplémentaires sur tous les systèmes de fichiers, et peut être utilisé en combinaison avec memlockd. zshet ksh93avoir un chmod intégré (bien que non activé par défaut).
Stéphane Chazelas
1
@ Dennis Mais comment pouvez-vous l'exécuter si vous ne pouvez pas démarrer du système? Comme le dit l'OP: «malheureusement, je ne peux plus du tout démarrer dans le système».
Nadir Sampaoli
@NadirSampaoli C'est certainement l'une de ces choses que vous devez comprendre avant de redémarrer. Cela peut être effectué avec succès après la modification de root et avant d’arrêter le système.
Ken Bellows
0

Vous pouvez essayer sudo chmod -R 744 /path-to-your-system/bind'une distribution en direct.

Erkin Alp Güney
la source