Permissions

如何從 chmod -R 000 /bin 中恢復?

  • August 4, 2021

現在我無法 chmod 它回來.. 或使用我的任何其他系統程序。幸運的是,這是在我一直在玩弄的虛擬機上,但是有什麼辦法可以解決這個問題嗎?系統為 Ubuntu Server 12.10。

我試圖重新啟動到恢復模式,不幸的是,由於在 init-bottom 可用性後沒有授予某些程序執行權限的權限,現在我根本無法啟動系統 - 系統只是掛起。這就是我所看到的:

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

在此之後電腦掛起。

啟動另一個乾淨的作業系統,掛載文件系統並修復權限。

由於損壞的文件系統存在於 VM 中,因此您的主機系統應該可用並且可以正常工作。在那裡掛載損壞的文件系統並修復它。

例如,對於 QEMU/KVM,您可以使用nbd掛載文件系統。

即使是root,您也無法執行未x設置權限位的文件。你可以做的是呼叫ld.so它(假設它們是動態連結的執行檔):

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

使用與chmod執行檔體系結構相匹配的那個。就我而言,x86_64一個:

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

或在其他地方或其他地方打電話/usr/bin來做chmod類似的事情perl

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

恢復某些文件的權限時要小心,/bin或者mount某些文件su具有 0755 以外的權限。

但是,如果您已重新啟動,則可能無法到達可以執行的地步,perl或者ld.so雖然。您可以通過以下方式修復問題initramfs(傳遞不正確的根目錄以在 initramfs 中獲取恢復 shell;另請參閱 Debian 上的break=bottomor break=initkernel 參數,以便 initramfs 在安裝根文件系統後為您提供 shell(只讀儘管))。或者從 Live CD 映像啟動您的 VM,或者按照其他人的建議通過在主機上安裝 VM 文件系統來修復。

修復 initramfs 方式:

grub中,編輯引導條目並從命令中刪除root=參數:linux

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-X啟動。Ubuntu 的 initramfs 找不到根文件系統,所以開始恢復sh。然後掛載根文件系統(在我的情況下/dev/vdb,適應你的機器)並在那裡修復:

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

啟動後,通過與另一個系統進行比較來修復不具有 755 權限的文件的權限。

python通過執行來修復init

grub中,編輯啟動項,這次保留root=參數,更改rorw並添加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                                 

然後,在 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

同樣,一旦啟動,通過與另一個系統進行比較來修復不意味著具有 755 權限的文件的權限。

引用自:https://unix.stackexchange.com/questions/77852