如何从chmod -R 000 / bin恢复?


36

现在,我无法将其更改为chmod ..或使用任何其他系统程序。幸运的是,这是在我一直在玩弄的VM上,但是有什么方法可以解决这个问题?系统是Ubuntu Server 12.10。

我试图重新启动进入恢复模式,但是不幸的是,由于在初始化-底部可用性运行后权限未授予某些程序,系统无法正常运行,现在我无法引导至系统。这是我看到的:

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

此后,计算机将挂起。


/binchmoded还是其中的文件/bin
斯特凡Chazelas

1
/ bin目录(带有-R选项)...两者
2013年

最好随身携带带有tinycore的USB。发生这种情况时很有用。
saga

Answers:


28

引导另一个干净的操作系统,挂载文件系统并修复权限。

由于损坏的文件系统位于VM中,因此您的主机系统应该可用并且可以正常工作。将损坏的文件系统挂载在那里并进行修复。

对于QEMU / KVM,您可以例如使用nbd挂载文件系统。


我认为这可能是解决问题的一种正确方法,但是,我需要尝试安装系统-现在我只是从映像文件中获取前置系统-如initrd.img memtest&abi中所示。
2013年

1
@jett,您已挂载了/boot该VM 的分区。尝试找到根文件系统。如果在LVM上,请vgchange -ay在连接后运行以将其nbd激活。
斯特凡Chazelas

1
@StephaneChazelas我知道了。非常感谢你们-我喜欢这些错误,已经学到了很多!
2013年

很高兴它是固定的。我想念一些东西。如果是vm,那么它只是主机系统的一个大文件,不是吗?您如何在其中安装任何东西进行维修?(我知道如何在非VM系统上执行此操作。)
Joe

68

即使使用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以外的权限。

如果您已经重新启动,但是,您可能不能够去那里,你可以运行点perlld.so虽然。您可以通过以下方式解决问题initramfs:(传递错误的根目录以在initramfs中获得恢复外壳;另请参阅Debian上的break=bottomor break=init内核参数,有关initramfs在安装根文件系统后为您提供外壳的情况(只读虽然))。或从实时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权限的文件的权限。

固定运行pythoninit

在中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权限的文件的权限。


5
+1,另一个很好的答案,斯蒂芬。我要添加:在这种already try to reboot情况下:在实时CD上引导,将rw包含/ bin的分区挂载到chmod 755 /bin(和(如果里面的文件也被更改的话))。但是之后,请检查所有文件是否具有正确的权限(取决于您的linux distrib,您可能可以对照原始软件包检查/ bin)
Olivier Dulac 2013年

4
哇。您的知识深度令人恐惧8-)。
slm

我无法使用ld.so执行。pb.abhijeetr.com/fRWf这里出了什么问题?
Abhijeet Rastogi 2013年

@shadyabhi,您可能有一个多体系结构的系统,正在尝试在64位可执行文件上使用32位ld.so。您必须有另一个ld.so目录,例如在/lib/x86_64-linux-gnu
斯特凡Chazelas

1
@Kwpolska,os.execl并且exec是用于执行,他们不派生进程,只需更换该可执行在相同的过程中,因此,所有在PID 1.流程1进行初始运行python,然后sh,再init
斯特凡Chazelas

8

使用python :)

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

那不需要/bin做任何事情。显然,我还没有尝试过...


嗯,我一直认为这种语言和其他脚本语言只会调用chmod程序。很高兴知道!
2013年

1
不,chmod是系统调用,由chmod程序以及chmodpython / perl / ruby​​等中的函数调用。shell确实会调用该chmod实用程序。
丹尼斯·考斯玛克

2
除了那些chmod内置的shell。在这种情况下,类似shell sash很有用。它是静态链接的,具有大多数恢复命令,例如chmod内置命令(因此不依赖任何其他命令)。它通常位于其中,/sbin尽管在所有文件系统上拥有额外的副本不会造成损害,并且可以与memlockd结合使用。zshksh93内置了chmod(尽管默认情况下未启用)。
斯特凡Chazelas

1
@Dennis但是,如果根本无法引导进入系统,如何运行它?正如OP所说:“不幸的是,现在我根本无法启动系统”。
Nadir Sampaoli

@NadirSampaoli这绝对是在重新启动之前需要抓住的那些东西之一。在切掉root之后并关闭系统之前,可以成功完成此操作。
肯·贝罗斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.