我真的很担心——因为我真的需要恢复我的 Ubuntu——并且浪费了很多时间来尝试解决这个问题。
基本上,我只是在参加安全课程的实验并遇到了这个问题。
好的,我遵循了以下命令:
cd /bin
rm sh
ln -s /bin/zsh /bin/sh
然后当我打开一个新终端时,它给出了某种错误。所以,我认为重启系统后这个问题就会消失。
但不幸的是,我的系统再也无法加载了。
首先,它会打开 grub2 启动管理器,然后当我在 Ubuntu 上按下回车键时,它会加载到一个黑屏,左上角有一个闪烁的光标。
我的大量工作以及工作和学习所需的所有编程环境都在这个系统中。
答案1
我不认为这会导致您无法启动,但您可以通过这样做恢复到旧的 sh,因为 /bin/sh 只是 /bin/dash 的符号链接......
启动直到出现闪烁的光标,然后按 Ctrl+Alt+F2 进入终端,然后执行
cd /bin
sudo rm sh # if this fails then just go to next
sudo ln -s dash sh
然后你可以重新启动(sudo reboot
)
编辑:对于将来的任何人来说,如果您无法通过按 Ctrl+Alt+F2 在启动时访问 shell 提示符,您可以执行以下操作之一:
选项 1:启动 Live CD,按“尝试”,然后打开终端并执行
sudo mount /dev/sda1 /mnt #replace sda1 with whatever drive/partition your install is on
cd /mnt/bin
sudo rm sh #if this fails then just go to next
sudo ln -s dash sh
选项 2:启动 Live CD,然后按“尝试”,然后在那里打开终端并执行
sudo mount /dev/sda1 /mnt #replace sda1 with whatever drive/partition your install is on
sudo chroot /mnt
cd /bin
rm sh # if this fails then just go to next
ln -s dash sh
然后你可以重新启动(sudo reboot
)
这应该恢复为默认的 sh 文件夹。
答案2
/bin/sh
建立符号链接导致/bin/zsh
问题并不奇怪,因为/bin/zsh
通常不存在。我怀疑嘚没有安装,所以东西坏了。这似乎特别有可能2如果您在新终端上看到的错误是:
bash: /usr/bin/lesspipe: /bin/sh: bad interpreter: No such file or directory
再次建立/bin/sh
链接dash
(Ubuntu 上的默认设置)通常是合适的解决方案——对于你的情况,因为你的目标是将系统恢复到之前的状态,所以这绝对是正确的方法。可以通过以下方式实现从实时媒体启动,如 Termhn 的精彩回答中所述1以及其他方式。
但是如果由于某些奇怪的原因您确实想在 Ubuntu 中使用zsh
而不是dash
for /bin/sh
,那么这可以实现——但不完全像您尝试的那样。
恢复sh
→dash
无需在线环境
我认为使用实时 CD/DVD/USB 是解决此问题的最佳方法,因为它比其他方法技术含量更低,而且非常很可能会顺利成功。
但如果您只想通过从硬盘启动来解决这个问题,那么您可以这样做。
乍一看,这个代码并不那么长,也不那么复杂,因为代码的很大一部分内容来自于(A)提出两种替代方案,并(二)屏幕截图。
首先,关闭或彻底重启(如果可以的话)。
这适用于所有解决方案,而不仅仅是那些试图在仍然从内部硬盘启动的情况下解决问题的解决方案。但如果你不这样做,这可能不是一个大问题。
根据损坏程度,Ctrl++Alt可能Delete无法成功关闭并重新启动 Ubuntu 系统。(通常,如果在基于文本的虚拟控制台。
如果Ctrl++Alt不起作用Delete,使用:
- Alt++重新SysRqREISUB乙噢特,或者
- Alt++SysRq至REISUO电源哦ff.
由于缺失导致的问题/bin/sh
不应该导致内核深处的故障,我认为这些“神奇的 SysRq”技术在这种情况下总是有效的。
init=/bin/dash
应该管用
启动时按住Shift以获取 GRUB 菜单。
它应该与该屏幕截图非常相似,但根据您所运行的 Ubuntu 版本和版本,它可能会有所不同。默认选择“Ubuntu”。保留该选择,但按e进行编辑。
(别担心,您的编辑仅适用于此靴子,并且不会被保存。)移至以 开头的行尾。(您可以使用箭头键、和到达行尾。)
linux /boot/vmlinuz-...
End输入一个空格,然后
init=/bin/dash
。然后按F10来启动此配置。您应该看到:
/bin/dash: 0: can't access tty: job control turned off #
这是一个根壳。
重新安装根文件系统readwrite 这样你就可以更改磁盘上的文件:
mount -o remount,rw /
此命令以及其后的命令在成功时(通常)不会产生任何输出。没关系。
创建
/bin/sh
符号链接到dash
而不是zsh
:cd /bin rm sh ln -s dash sh
如果你喜欢,您可以通过运行来检查
sh
符号链接是否已正确重定向ls -l sh
,它应该显示类似以下内容:lrwxrwxrwx 1 root root 4 Oct 2 23:13 sh -> dash
(
sh -> dash
是关键部分。)使用 重新启动
reboot -f
。您的系统应该已经修复。
替代方法:恢复模式可能工作。也许吧。
恢复模式可能无需 即可运行sh
。我自己还没有让它工作过,也不知道它是否真的能工作——我让 Ubuntu 正常启动(没有 GUI),因为sh
符号链接损坏,但在我尝试恢复模式之前,它停止工作了(对我来说也不起作用)。
为了更可靠的方法,请返回init=/bin/dash
应该管用(请注意,恢复模式并非完全不可靠一般来说,如果没有 就无法正常工作/bin/sh
。)
如果您想尝试恢复模式:
要进入恢复模式,请在启动期间按住Shift以获取 GRUB 菜单。
选择Ubuntu 的高级选项。
在可用内核的菜单中,按↓将选择移动到以 结尾的条目
(recovery mode)
,然后按Enter。如果不起作用,您可以按照上述方法使用“magic SysRq”重新启动。如果起作用,您将看到恢复菜单。
在恢复菜单中,反复↓按直到
root Drop to root shell prompt
已选定。按Enter。
执行步骤 5 和 6(以及可选步骤 7,如果你愿意的话)
init=/bin/dash
应该管用方法同上。运行
reboot
重新启动。您可以运行
exit
,然后选择恢复。但我建议重新启动,这样系统就可以sh
从一开始就干净地启动,并且可以访问和运行。(如果您设法通过sh
损坏的符号链接进入恢复模式,那仍然并不意味着一切都正常。)
如果您有兴趣提供zsh
(sh
无论是真实的,还是仅仅是理论上的),请继续阅读。
您尝试的sh
→程序存在问题zsh
作为一般程序,cd /bin; rm sh; ln -s /bin/zsh /bin/sh
(正如您在实验室练习中所规定的)是糟糕的建议,至少有两个原因:
/bin/zsh
有时即使zsh
安装了也不存在。这取决于安装方式和使用的操作系统。zsh
是一个大型、复杂的 shell,不经常使用,/bin/sh
因此通常不需要在单用户模式否则,/usr
在安装单独的分区之前,可能会发生这种情况。单用户模式下不需要的可执行文件通常位于 的子目录中/usr
。Ubuntu 的
zsh
做提供/bin/sh
。但在其他系统上,它可能是/usr/bin/zsh
或甚至/usr/local/bin/sh
(就像在我的 FreeBSD 系统上,我通过 安装它pkg
)。此次演习背后的动机可能是为了加强系统“炮弹休克”(或者由于
bash
接受传入环境变量的 shell 函数的方式而产生的其他可能的解析错误)。但对于此目的而言,这不是一种广泛适用的做法。尽管许多 GNU/Linux 系统(例如 Fedora、RHEL 和 Slackware)都
bash
提供了/bin/sh
,但在许多其他系统中,其他一些 shell 也提供了/bin/sh
。这包括使用 的 Ubuntudash
。与 一样zsh
,dash
不易受到“Shellshock”攻击,并且不使用任何机制从环境变量导入函数定义(或根本不导入),因此类似的错误不太可能影响它。
因此,根据具体情况,呈现给您的这个练习可能存在缺陷。您可能想与您的教授讨论此事。也许课程或传达课程的方式可以改进。
根据(甚至更大程度上)具体情况,这些考虑因素也可能引起关注:
通常,
sh
是已安装的另一个 shell 的符号链接、硬链接或副本。但在某些系统上,特别是某些非 GNU/Linux 系统的类 Unix 系统,sh
可能是与其他任何文件不同的可执行文件。除非已知情况并非如此,否则在rm
执行之前进行检查是个好主意!mv
在这种情况下,执行 ing 可能更合适。改变系统配置的练习,特别是那些需要以 root 身份运行命令来执行不寻常操作的练习,通常不应在生产机器上执行。实验和探索在实践上是必要的,而且具有内在价值。但是,当它们可能涉及破坏事物时,最好在那些继续运行对需要完成的重要工作来说并不重要的装置上进行。
换句话说,在“真正”部署之前,最好先进行测试。(虚拟机通常非常适合此用途。)
Ubuntu 的嘚确实提供了 shell 的副本3以及。/bin
但是/usr/bin
在 Ubuntu 中默认情况下zsh
根本没有安装。
符号链接不需要其目标存在:
ek@Ilex:~$ rm foo
rm: cannot remove ‘foo’: No such file or directory
ek@Ilex:~$ ln -s foo bar
ek@Ilex:~$ ls -l foo bar
ls: cannot access foo: No such file or directory
lrwxrwxrwx 1 ek ek 3 Oct 2 20:25 bar -> foo
ek@Ilex:~$ file bar
bar: broken symbolic link to `foo'
由于它/bin/sh
是用于启动系统和执行其他任务的许多重要脚本的解释器,因此它需要存在。使其成为无效链接将导致 Ubuntu 系统无法运行。
开始zsh
提供/bin/sh
Ubuntu 是dash
为使用而设计的sh
,并未zsh
以此为sh
目的进行开发或测试。请不要在需要执行关键任务的系统上尝试此操作。这严格是为了教育/娱乐,应该在非关键虚拟机或其他非关键系统中完成。2
安装嘚;在 Ubuntu 中默认情况下它未安装。
sudo apt-get update sudo apt-get install zsh
指向
sh
而zsh
不是dash
奔跑cd /bin; rm sh; ln -s /bin/zsh /bin/sh
(就像你做的那样)。通过运行来验证
sh
是否为良好的链接(或者,如果您不再使用,请使用)。zsh
file sh
/bin
file /bin/sh
您应该看到
sh: symbolic link to `zsh'
(或/bin/sh: symbolic link to `zsh'
)。重新启动并查看 Ubuntu 是否仍然有效。
笔记
- 显然,至少有时,从基于文本的虚拟控制台,也解释为Termhn 的回答。有一次我测试的时候,这个方法奏效了2,但另一次测试失败了。我知道对你不起作用(相比之下,live CD 方法非常可靠。)
- 此答案的测试是在 VirtualBox 虚拟机中运行的 64 位 Ubuntu Mate 14.10 Utopic Unicorn(测试版)系统上进行的。(并不是因为该配置可以最好地模拟此问题,而只是因为这是我手头上用于测试的桌面 Ubuntu 系统。)对我有用的东西并不能保证它对你也有效,即使在相同版本的 Ubuntu 上也是如此。
- 在 Ubuntu 上,
/bin/zsh
通常是指向 的符号链接/etc/alternatives/zsh
,通常是指向 的符号链接/bin/zsh5
(这是实际的 Z Shell 可执行文件)。但由于和/bin
都/etc
位于根文件系统上,即使/usr
通过网络或以其他方式安装在单独的卷上,这也是可以的。