操作系统是 Centos 6.5 64 位
我下载了一个 tar 文件,想解压mv
它。
我 untared,然后不小心(以 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
phe*_*mer 24
如果您的系统已busybox
安装,您可以使用它来放回原处。
busybox
是一个二进制文件,其中内置了许多标准实用程序。诸如mv
, sh
,之类的东西ls
。
从您对 Pavel 回答的评论来看,听起来一切都以/var
. 你可以试试做/var/bin/busybox mv /var/{bin,etc,lib32,lib64,root,sbin,usr} /
。这应该可以使您的大部分系统再次运行。有一些目录,例如/tmp
它们也作为 存在/var/tmp
,因此您不能只是移动它们。希望这些是那些mv
抱怨的人,他们被单独留下。
您还提到您丢失了 root shell,这su
给您带来了ld-linux
库错误。您或许可以使用以下内容:
LD_LIBRARY_PATH=/var/lib64 /var/lib64/ld-linux-x86-64.so.2 /var/bin/su
Run Code Online (Sandbox Code Playgroud)
注意:尝试此操作后,它不起作用。这是因为su
需要/etc
( passwd
、pam.d
等) 中的多个文件。如果/etc
仍然完好无损,这将有很大的成功机会。
如果您没有可用的 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} /
Run Code Online (Sandbox Code Playgroud)
正如评论中所讨论的,如果您丢失了 root shell,那么您将陷入困境。基本上为了解决这个问题,您需要root权限。到达那里的唯一方法是拥有一个实用程序,例如su
或sudo
升级您的权限(此时两者都不起作用),或者劫持另一个已经以 root 身份运行的程序(取决于正在运行的程序,不太可能)。
这使得唯一的选择是现场 CD。一旦启动到现场CD(或现场USB,或其他),只需安装根卷,并移动受影响的目录出来/var
回到自己原来的家中/
。
folder/*
会扩展到诸如folder/foo
and 之类的东西folder/bar
。
/*
会扩展到类似的东西/bin
/lib32
/lib64
/etc
/home
/root
/var
。请注意,这/var
是最后一项。
因此,当 shell 展开所有这些 glob 时,它会运行如下内容:
mv folder/foo folder/bar /bin /lib32 /lib64 /etc /home /root /var
Run Code Online (Sandbox Code Playgroud)
就像/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
.
Pav*_*rda 10
mv folder/* ./*
也是错误的。您应该更加注意您运行的命令的语义。mv
带有两个以上参数的命令只取除最后一个参数之外的所有参数,并将它们指向的路径移动到最后一个参数中指定的目录中。
要将所有目录(隐藏目录除外)从文件夹移动到当前目录,您应该使用:
mv folder/* .
Run Code Online (Sandbox Code Playgroud)
你破坏了你的运行系统。您的 shell 和内置命令继续工作。您将必须启动 Live CD 并将目录移回。我不知道 bash 内置移动/重命名文件可以让您在不重新启动的情况下修复这种情况,有关更多详细信息,请参阅 Patrick 的回答。
重要
如果您在这里运行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)成功!