Wie von einem chmod -R 000 / bin erholen?

36

Und jetzt bin ich nicht in der Lage, es zurück zu chmod .. oder eines meiner anderen Systemprogramme zu verwenden. Zum Glück ist dies auf einer VM, mit der ich schon gespielt habe, aber gibt es eine Möglichkeit, dies zu beheben? Das System ist Ubuntu Server 12.10.

Ich habe versucht, in den Wiederherstellungsmodus zurückzukehren. Leider kann ich jetzt überhaupt nicht mehr in das System booten, da die Berechtigungen einige Programme nach der Verfügbarkeit von init-bottom nicht mehr gewähren. Das System hängt nur noch. Das sehe ich:

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

Danach hängt der Computer.

jett
quelle
Ist es /binIhnen in CHMOD oder die Dateien /binoder beide?
Stéphane Chazelas
1
das Verzeichnis / bin mit der Option -R ... both
jett
Es ist gut, einen USB-Stick mit tinycore zur Hand zu haben. Nützlich, wenn so etwas passiert.
Saga

Antworten:

28

Starten Sie ein anderes sauberes Betriebssystem, hängen Sie das Dateisystem ein und korrigieren Sie die Berechtigungen.

Da sich Ihr kaputtes Dateisystem in einer VM befindet, sollte Ihr Hostsystem verfügbar und funktionsfähig sein. Hängen Sie Ihr defektes Dateisystem dort ein und beheben Sie es.

Im Falle von QEMU / KVM können Sie das Dateisystem zum Beispiel mit nbd mounten .

michas
quelle
Ich denke, dies ist wahrscheinlich richtig, um es zu beheben, aber ich muss versuchen, das System zu montieren - im Moment hole ich nur das Vorsystem aus der Image-Datei - wie in initrd.img memtest & abi.
jett
1
@jett, du hast die /bootPartition dieser VM gemountet . Versuchen Sie, das Root-Dateisystem zu finden. Wenn auf LVM, führen Sie vgchange -aynach dem Anschließen das aus nbd, um es zu aktivieren.
Stéphane Chazelas
1
@StephaneChazelas Ich habe es. Vielen Dank an beide - ich liebe diese Art von Fehlern, habe eine Menge gelernt!
Jett
Ich bin froh, dass es behoben ist. Ich vermisse etwas. Wenn es ein VM ist, dann ist es nur eine große Datei für das Host-System, nicht wahr? Wie kann man irgendetwas darin anbringen, um die Reparaturen durchzuführen? (Ich verstehe, wie dies auf einem Nicht-VM-System zu tun ist.)
Joe
68

Selbst als root, können Sie keine Dateien ausführen , die keine haben xErlaubnis Bit gesetzt. Sie können es jedoch aufrufen ld.so(vorausgesetzt, es handelt sich um dynamisch verknüpfte ausführbare Dateien):

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

Verwenden Sie diejenige, die der Architektur der chmodausführbaren Datei entspricht. In meinem Fall der x86_64eine:

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

Oder rufen Sie etwas in /usr/binoder an anderer Stelle das zu tun , chmodwie perl:

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

Hüten Sie sich vor , wenn Berechtigungen wieder herstellt , dass einige Dateien in /binwie mountoder die suentsprechenden Berechtigungen haben sollen andere als 0755.

Wenn Sie neu gestartet haben, jedoch können Sie nicht in der Lage sein , bis zu dem Punkt zu gelangen , wo Sie ausführen können , perloder ld.soaber. Sie können das Problem beheben, initramfsindem Sie ein falsches Stammverzeichnis übergeben, um eine Wiederherstellungsshell im initramfs abzurufen. Weitere Informationen finden Sie unter Debian im Parameter break=bottomoder im break=initKernel, damit das initramfs Ihnen eine Shell gibt, nachdem das Root-Dateisystem bereitgestellt wurde (schreibgeschützt) obwohl)). Sie können Ihre VM auch von einem Live-CD-Image starten oder das VM-Dateisystem wie von anderen vorgeschlagen auf dem Host mounten.

Initramfs reparieren:

In grubBearbeiten Sie den Boot - Eintrag und entfernen Sie die root=Parameter aus dem linuxBefehl:

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-Xzu booten. Ubuntus initramfs findet das Root-Dateisystem nicht, also starte eine Wiederherstellung sh. Hängen Sie dann das Root-Dateisystem ein ( /dev/vdbpassen Sie es in meinem Fall an Ihren Computer an) und beheben Sie die folgenden Probleme:

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

Korrigieren Sie nach dem Start die Berechtigungen der Dateien, für die keine 755-Berechtigungen vorgesehen sind, indem Sie sie mit einem anderen System vergleichen.

Fixierung durch Laufen pythonals init:

In grubBearbeiten Sie die Boot - Eintrag, halten Sie diese Zeit , um die root=Parameter ändern rozu rwund fügen Sie ein 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                                 

Dann an der Python-Eingabeaufforderung:

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

Korrigieren Sie nach dem Booten erneut die Berechtigungen der Dateien, für die keine 755-Berechtigungen vorgesehen sind, indem Sie sie mit einem anderen System vergleichen.

Stéphane Chazelas
quelle
5
+1, eine weitere gute Antwort, Stephane. Ich würde hinzufügen: im already try to rebootFall: Booten Sie von einer Live-CD, hängen Sie die Partition mit / bin und chmod 755 /bin(und die darin enthaltenen Dateien, falls diese ebenfalls geändert wurden) ein. Aber überprüfen Sie anschließend, ob alle Dateien die richtige Berechtigung haben (abhängig von Ihrem Linux-Distributor können Sie wahrscheinlich / bin gegen das Originalpaket prüfen)
Olivier Dulac
4
WOW. Ihre Tiefe des Wissens ist unheimlich 8-).
SLM
Ich kann ld.so nicht zum Ausführen verwenden. pb.abhijeetr.com/fRWf Was läuft hier falsch?
Abhijeet Rastogi
@shadyabhi, Sie haben wahrscheinlich ein Multiarch-System und versuchen, die 32-Bit-ld.so auf einer ausführbaren 64-Bit-Datei zu verwenden. Sie müssen eine andere haben ld.so, vielleicht in einem Verzeichnis wie /lib/x86_64-linux-gnu.
Stéphane Chazelas
1
@Kwpolska, os.execlund execsind für die Ausführung, sie keinen Prozess Gabel, ersetzt einfach die ausführbare im gleichen Prozess , so dass alle 1 zunächst in pid 1. Verfahren erfolgt läuft python, dann sh, dann init.
Stéphane Chazelas
8

Benutze Python :)

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

Das sollte nichts brauchen /bin, um seine Arbeit zu erledigen. Offensichtlich habe ich das nicht ausprobiert ...

Dennis Kaarsemaker
quelle
Hmm, ich habe immer gedacht, dass diese und andere Skriptsprachen einfach das Programm chmod aufrufen würden. Ziemlich gut zu wissen!
jett
1
Nein, es chmodhandelt sich um einen Systemaufruf, der vom chmodProgramm und auch von der chmodFunktion in Python / Perl / Ruby usw. aufgerufen wird. Shells rufen das chmodDienstprogramm jedoch auf.
Dennis Kaarsemaker
2
Außer den Muscheln, die chmodeingebaut sind. Das ist die Art von Situation, in der Muscheln sashnützlich sind. Es ist statisch verknüpft und verfügt über die meisten Wiederherstellungsbefehle , wie chmodz. B. Built-In. Es wird normalerweise verwendet, /sbinobwohl es nicht schaden würde, zusätzliche Kopien auf allen Dateisystemen zu haben, und kann in Kombination mit memlockd verwendet werden. zshund ksh93habe ein chmod eingebaut (obwohl nicht standardmäßig aktiviert).
Stéphane Chazelas
1
@ Tennis Aber wie können Sie es ausführen, wenn Sie das System überhaupt nicht booten können? Wie das OP sagt: «Leider kann ich jetzt überhaupt nicht mehr in das System booten».
Nadir Sampaoli
@ NadirSampaoli Dies ist definitiv eines der Dinge, die Sie fangen müssen, bevor Sie neu starten. Dies kann nach dem chmodding root und vor dem Herunterfahren des Systems erfolgreich durchgeführt werden.
Ken Bellows
0

Sie können es sudo chmod -R 744 /path-to-your-system/binin einer Live-Distribution versuchen .

Erkin Alp Güney
quelle