Jak odzyskać z chmod -R 000 / bin?

36

A teraz nie jestem w stanie przeskoczyć z powrotem .. ani użyć żadnego z moich innych programów systemowych. Na szczęście jest to na maszynie wirtualnej, z którą bawiłem się, ale czy jest jakiś sposób na rozwiązanie tego? System to Ubuntu Server 12.10.

Próbowałem zrestartować się w trybie odzyskiwania, niestety teraz nie jestem w stanie uruchomić się w systemie z powodu uprawnień, które nie przyznają niektórym programom dostępności od początku do początku - system po prostu się zawiesza. Oto co widzę:

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

Następnie komputer się zawiesza.

jett
źródło
Czy to /binchmoded czy pliki w, /binczy oba?
Stéphane Chazelas
1
katalog / bin z opcją -R ... oba
jett
Dobrze jest mieć pod ręką USB z Tinycore. Przydatne, gdy dzieje się coś takiego.
saga

Odpowiedzi:

28

Uruchom inny czysty system operacyjny, zamontuj system plików i napraw uprawnienia.

Ponieważ uszkodzony system plików mieszka na maszynie wirtualnej, system hosta powinien być dostępny i działać. Zamontuj tam uszkodzony system plików i napraw go.

W przypadku QEMU / KVM możesz na przykład zamontować system plików za pomocą nbd .

michas
źródło
Myślę, że jest to prawdopodobnie poprawny sposób, aby to naprawić, jednak muszę spróbować zainstalować system - teraz właśnie pobieram pre-system z pliku obrazu - jak w initrd.img memtest & abi.
jett
1
@jett, zamontowałeś /bootpartycję tej maszyny wirtualnej. Spróbuj zlokalizować główny system plików. Jeśli na LVM, uruchom vgchange -aypo podłączeniu, nbdaby go aktywować.
Stéphane Chazelas
1
@StephaneChazelas Mam to. Dziękuję obojgu bardzo - uwielbiam tego rodzaju błędy, nauczyłem się mnóstwo!
jett
Cieszę się, że to naprawiono. Coś mi brakuje. Jeśli jest to vm, to jest to tylko jeden duży plik do systemu hosta, prawda? Jak zamontować coś w środku, aby wykonać naprawy? (Rozumiem, jak to zrobić w systemie innym niż VM).
Joe
68

Mimo rootto nie można wykonywać plików, które nie mają xustawionego bitu uprawnień. Możesz jednak wywołać ld.sogo (pod warunkiem, że są to pliki wykonywalne połączone dynamicznie):

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

Użyj tej, która pasuje do architektury chmodpliku wykonywalnego. W moim przypadku ten x86_64:

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

Lub zadzwoń coś /usr/binlub gdzie indziej, aby wykonać chmodjak perl:

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

Uważaj podczas przywracania uprawnień, które niektóre pliki /binlubią mountlub sumają mieć uprawnienia inne niż 0755.

Jeśli po ponownym uruchomieniu komputera, jednak może nie być w stanie dostać się do punktu, w którym można uruchomić perlalbo ld.sochociaż. Możesz to naprawić z tego powodu initramfs(przekaż niepoprawny katalog główny, aby uzyskać powłokę odzyskiwania w initramfs; zobacz także parametr break=bottomlub break=initjądro Debiana, aby initramfs dał ci powłokę po zamontowaniu głównego systemu plików (tylko do odczytu) chociaż)). Lub uruchom maszynę wirtualną z obrazu CD na żywo lub napraw, instalując system plików VM na hoście, jak sugerowali inni.

Naprawianie sposobu initramfs:

W grubdokonaj edycji wpisu rozruchu i usuń root=parametr z linuxpolecenia:

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-Xuruchomić. Initramfs Ubuntu nie znajdzie głównego systemu plików, więc rozpocznij odzyskiwanie sh. Następnie zamontuj główny system plików (w moim przypadku /dev/vdbdostosuj się do swojego komputera) i napraw tam rzeczy:

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

Po uruchomieniu popraw uprawnienia do plików, które nie mają mieć uprawnień 755, porównując z innym systemem.

Naprawianie przez uruchomienie pythonjako init:

W grubedytujemy wpisu rozruchu, tym razem zachować root=parametr, zmiany rodo rwi dodaj 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                                 

Następnie w pytaniu 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

Ponownie, po uruchomieniu, napraw uprawnienia do plików, które nie mają mieć uprawnień 755, porównując z innym systemem.

Stéphane Chazelas
źródło
5
+1, kolejna świetna odpowiedź, Stephane. Dodałbym: w already try to rebootprzypadku: uruchom na żywo CD, zamontuj rw partycję zawierającą / bin oraz chmod 755 /bin(i pliki wewnątrz, jeśli również zostały zmienione). Ale potem sprawdź, czy wszystkie pliki mają odpowiednie uprawnienia (w zależności od dystrybucji Linuksa, prawdopodobnie możesz sprawdzić / bin w stosunku do oryginalnego pakietu)
Olivier Dulac
4
ŁAŁ. Twoja głębia wiedzy jest przerażająca 8-).
slm
Nie mogę użyć ld.so do wykonania. pb.abhijeetr.com/fRWf Co się tutaj dzieje nie tak?
Abhijeet Rastogi
@shadyabhi, prawdopodobnie masz system wielościeżkowy i próbujesz użyć 32-bitowego pliku ld.so na 64-bitowym pliku wykonywalnym. Musisz mieć inny ld.so, może w jakimś katalogu /lib/x86_64-linux-gnu.
Stéphane Chazelas
1
@Kwpolska, os.execli execsą do wykonania, ale nie wybulić proces, wystarczy zastąpić plik wykonywalny w tym samym procesie , więc wszystko odbywa się w pid 1. 1 Proces początkowo biegnie python, potem sh, potem init.
Stéphane Chazelas
8

Użyj Pythona :)

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

To nie powinno wymagać niczego, /binaby wykonać swoją pracę. Oczywiście nie wypróbowałem tego ...

Dennis Kaarsemaker
źródło
Hmm, zawsze myślałem, że ten i inne języki skryptowe wywołują program chmod. Całkiem dobrze wiedzieć!
jett
1
Nie, chmodto wywołanie systemowe wywoływane przez chmodprogram, a także przez chmodfunkcję w python / perl / ruby ​​itp. Powłoki wywołują jednak chmodnarzędzie.
Dennis Kaarsemaker
2
Z wyjątkiem tych, które mają chmodwbudowane. W takiej sytuacji sashprzydatne są takie pociski . Jest statycznie powiązany i ma większość poleceń odzyskiwania , takich jak chmodwbudowane (więc nie polega na niczym innym). Zwykle siedziałby w /sbinnim, chociaż nie zaszkodziłoby posiadanie dodatkowych kopii na wszystkich systemach plików, i może być używany w połączeniu z memlockd. zshi ksh93mają wbudowany chmod (choć domyślnie nie jest włączony).
Stéphane Chazelas
1
@Dennis Ale jak go uruchomić, jeśli w ogóle nie można uruchomić systemu? Jak mówi PO: „niestety nie mogę w ogóle uruchomić systemu”.
Nadir Sampaoli
@NadirSampaoli Jest to zdecydowanie jedna z tych rzeczy, które musisz złapać przed ponownym uruchomieniem. Można to z powodzeniem zrobić po chmodding root i przed zamknięciem systemu.
Ken Bellows
0

Możesz spróbować sudo chmod -R 744 /path-to-your-system/binz dystrybucji na żywo.

Erkin Alp Güney
źródło