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

jet*_*ett 41 permissions chmod executable system-recovery

现在我无法 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
Run Code Online (Sandbox Code Playgroud)

在此之后,计算机挂起。

Sté*_*las 72

即便如此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
Run Code Online (Sandbox Code Playgroud)

使用与chmod可执行文件体系结构匹配的那个。在我的情况下x86_64

sudo /lib/x86_64-linux-gnu/ld-2.27.so /bin/chmod 755 /bin /bin/chmod
Run Code Online (Sandbox Code Playgroud)

或者在/usr/bin或其他地方调用一些东西来做chmod类似的事情perl

sudo perl -e 'chmod 0755, "/bin", "/bin/chmod"
Run Code Online (Sandbox Code Playgroud)

在恢复某些文件的权限时要小心,这些文件/bin类似于mountsu打算具有 0755 以外的权限。

如果您已经重新启动,但是,您可能不能够去那里,你可以运行点perlld.so虽然。您可以通过以下方式修复问题initramfs(通过不正确的根目录以获取 initramfs 中的恢复 shell;另请参阅Debian 上的break=bottomorbreak=init内核参数,以便 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                                 
                                                                         
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

启动后,通过与另一个系统进行比较来修复不具有 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                                 
Run Code Online (Sandbox Code Playgroud)

然后,在 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
Run Code Online (Sandbox Code Playgroud)

同样,一旦启动,通过与另一个系统进行比较来修复不具有 755 权限的文件的权限。

  • 哇。你的知识深度是可怕的 8-)。 (6认同)
  • +1,另一个很好的答案,斯蒂芬。我要补充一点:在“已经尝试重启”的情况下:在实时 CD 上启动,挂载包含 /bin 和 `chmod 755 /bin` 的分区(以及里面的文件,如果它们也被更改了)。但之后,检查所有文件是否具有正确的权限(取决于您的 linux 发行版,您可能可以针对原始包检查 /bin) (5认同)

mic*_*has 30

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

由于损坏的文件系统存在于虚拟机中,因此您的主机系统应该可用并正常工作。在那里安装损坏的文件系统并修复它。

例如,在 QEMU/KVM 的情况下,您可以使用nbd挂载文件系统。


Den*_*ker 9

使用蟒蛇:)

$ python
>>> import os
>>> os.chmod('/bin', 0755)
Run Code Online (Sandbox Code Playgroud)

这不应该需要任何东西/bin来完成它的工作。显然,我还没有尝试过这个......

  • 不,`chmod` 是一个系统调用,由`chmod` 程序以及python/perl/ruby 等中的`chmod` 函数调用。shell 确实调用了`chmod` 实用程序。 (3认同)
  • 除了那些内置了 `chmod` 的 shell。在这种情况下,像 `sash` 这样的 shell 很有用。它是静态链接的,并且具有大多数 _recovery_ 命令,例如内置的 `chmod`(因此不依赖于其他任何东西)。它通常位于 `/sbin` 中,尽管它不会损害在所有文件系统上拥有额外副本,并且可以与 memlockd 结合使用。`zsh` 和 `ksh93` 有一个内置的 chmod(虽然默认情况下没有启用)。 (2认同)