操作系统是Centos 6.5 64位
我下载了一个 tar 文件并想解压mv
它。
我解压,然后意外地(以 root 身份)运行mv folder/* /*
而不是mv folder/* .
bash 说它无法覆盖某些文件,然后请求其他文件的许可。我按 ctrl-c 退出。
我已将终端会话保持打开状态,但已退出su
。
现在我失去了对大多数shell
命令的访问权限,无法访问ls
任何目录,也无法返回到su
.
网络服务器和服务似乎仍在运行。我可以运行很少的命令,cd
就是其中之一,当我尝试cd
运行时,它/etc
会/bin
出现错误no directory found
。
编辑刚刚注意到/
( bin
、etc
、lib64
、root
)中缺少的所有文件夹sbin
都被移动到/var
目录中,我尝试/var/bin/su
并得到:
-bash: /var/bin/su: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
答案1
如果您的系统已busybox
安装,您可以使用它来恢复。
busybox
是一个二进制文件,内置有许多标准实用程序。诸如mv
、sh
、ls
等之类的东西。
从你对帕维尔答案的评论来看,听起来一切都结束了/var
。你可以尝试做/var/bin/busybox mv /var/{bin,etc,lib32,lib64,root,sbin,usr} /
.这应该会让你的大部分系统再次运行。有一些目录,例如/tmp
也以 的形式存在/var/tmp
,因此您不能只是移动它们。希望那些抱怨的人mv
不会打扰他们。
获取 root shell
您还提到您丢失了根 shell,这su
给您带来了ld-linux
库错误。您也许可以使用以下内容:
LD_LIBRARY_PATH=/var/lib64 /var/lib64/ld-linux-x86-64.so.2 /var/bin/su
注意:尝试此操作后,它不起作用。这是因为需要( 、和其他)su
中的多个文件。如果还完好的话,这次成功的机会很大。/etc
passwd
pam.d
/etc
不带busybox
如果您没有可用的 busybox,您可以使用与以下相同的 ld-linux 技巧su
:
LD_LIBRARY_PATH=/var/lib64 /var/lib64/ld-linux-x86-64.so.2 /var/bin/mv /var/{bin,etc,lib32,lib64,root,sbin,usr} /
来自现场 CD
正如评论中所讨论的,如果您丢失了 root shell,那么您就会陷入困境。基本上为了解决这个问题,你需要 root 权限。实现这一目标的唯一方法是使用诸如su
或sudo
escalate 你的权限之类的实用程序(此时两者都不起作用),或者劫持另一个已经以 root 身份运行的程序(取决于正在运行的程序,不太可能)。
这样一来,唯一的选择就是 Live CD。一旦启动到 live CD(或 live USB,或其他),只需安装根卷,并将受影响的目录移回/var
其原始目录/
。
发生的事情概要
folder/*
会扩展到诸如folder/foo
和 之类的东西folder/bar
。
/*
会扩展到类似的东西/bin
/lib32
/lib64
/etc
/home
/root
/var
。请注意这/var
是最后一项。
因此,当 shell 展开所有这些 glob 时,它会运行如下所示的代码:
mv folder/foo folder/bar /bin /lib32 /lib64 /etc /home /root /var
正如/var
列表中的最后一项一样,所有内容都已移入其中。
为什么/var/bin/su
会出现错误/lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory
Linux 中的几乎所有二进制文件都是动态链接到ld-linux
.ld-linux
是负责加载二进制文件所需的其他库的库。在您的系统上,它位于/lib64/ld-linux-x86-64.so.2
.由于此目录已移动,任何动态链接的可执行文件将不再工作。
busybox 工作的原因是 busybox 是静态链接的。它不使用ld-linux
.
答案2
mv folder/* ./*
也是错误的。您应该更加小心所运行命令的语义。具有两个以上参数的命令mv
只接受除最后一个参数之外的所有参数,并将它们指向的路径移动到最后一个参数中指定的目录中。
移动所有目录(隐藏目录除外)文件夹到当前目录,您应该使用:
mv folder/* .
你已经破坏了你的运行系统。您的 shell 和内置命令将继续工作。您必须启动 Live CD 并将目录移回原处。我不知道 bash 内置命令可以移动/重命名文件,让您无需重新启动即可解决问题,请参阅帕特里克的答案以获取更多详细信息。
答案3
我不小心将 /usr 移至 /usr_old,一切都陷入困境。幸运的是,我留在提示符下并能够执行以下命令来恢复 usr 文件夹:
LD_LIBRARY_PATH=/usr_old/lib64 /usr_old/lib64/ld-linux-x86-64.so.2 /usr_old/bin/mv /usr_old /usr
答案4
重要的
如果您在这里,并且运行mv
不正确,无法运行shell
命令,并且根目录(/
)中缺少文件夹,首先,如果您有SU
,请不要退出,SU
直到修复为止,因为您将无法恢复它。如果你是远程连接的,如果你断开连接,你将无法ssh
离开服务器,不要reboot
- 大多数正在运行的服务应该没问题。您可以尝试帕特里克建议的众多解决方案之一......但是,如果您像我一样搞砸了,您可能需要物理访问。
一旦到达机器前,我就重新启动了它。正如预期的那样,我确实收到了内核恐慌。
我认为这将是一个非常简单的修复,插入 livecd,进入救援模式到目前为止,这很容易 - 然后我必须尝试挂载我的根目录。然而,我需要的不仅仅是一个简单的安装命令。
这是因为我和许多人一样,有一个 lvm 文件系统,这是我第一次不得不处理这样的救援。我必须在网上搜索以了解我需要做什么。我已将这些信息合并到这篇文章中。这是我解决问题的过程。
1)插入Centos_6.4_min cd
2)GUI界面问我想做什么,选择Rescue
3)Rescue尝试挂载当前系统,但表明我没有Linux分区
shell
4)出现选项时选择进入
此时,我尝试了很多方法来安装系统,但没有运气,我很确定这些都是我必须采取的步骤(因为 lvm):
5)扫描我的书,
lvmdiskscan
6)运行lvscan,显示所有列为“非活动”
lvscan
7)加载设备模块
modprobe dm-mod
8)将存在的卷更改为活动卷
vgchange -ay
9)lvscan
再次运行,现在所有项目都列为“活动”
10)创建挂载点并挂载逻辑分区
mkdir /mnt/root
mount /dev/VolGroup00/LogVol00 /mnt/root
11)将文件夹移回(您可能需要其他文件夹):
mv /var/{bin,etc,lib64,mnt,root,sbin} /
12)reboot
13)成功!