如何恢复已删除的 /bin/bash?

如何恢复已删除的 /bin/bash?

在我的 Debian 机器上,我意外删除了 /bin/bash。有没有办法在不重新安装机器的情况下将其恢复?

如果有帮助的话。我仍然处于登录状态。我想一旦我退出,我就无法登录了,因为这是我的登录 shell。

答案1

ln -s /bin/sh /bin/bash
apt-get install --reinstall bash

答案2

如果您仍处于登录状态,请发出以下命令:

sudo apt-get install --reinstall bash

答案3

新 Linux 系统通常无法在没有正常运行的 bash 的情况下启动。如果您丢失了 bash 并尝试重新启动,您可能会(暂时)无法进入系统。

如果您仍有打开的会话,请跳过下一段有关从 Live CD 启动的内容并直接转到下一段。否则请尝试:

如果您丢失了 bash,并且您的所有用户帐户或 root 都无法登录,而且您的系统甚至无法启动,那么您可以尝试使用 live cd 启动系统,挂载系统所在的硬盘驱动器并导航到该系统上的 /bin,例如“cd /mount/sda1/bin”,将 bash 移动到 bash.bak“mv bash bash.bak”,然后从正在运行的某个 shell 建立到 bash 的链接,例如“ln ksh bash”,退出并尝试重新启动。它可能有效也可能无效,对我来说,在 slackware 和 debian 上它是有效的。一旦您启动了系统,使用 chsh 命令更改用户和 root 的登录 shell,然后删除从 ksh 到 bash 的链接。

在此之后,其中一些建议可能会起作用。

sh 本身已经很古老了,在某些 Linux 系统中,/bin/sh 实际上是为了提供遗留支持,并且只是 /bin/bash 的一个链接,因此将您的登录 shell 更改为 /bin/sh 可能不起作用。

如果您仍有 root 终端,则一切正常。使用 chsh 命令将您的登录 shell 更改为您仍拥有的 shell。我为此使用了 /bin/ksh。请注意,您的系统可能无法通过这种方式启动,但至少您现在可以进行救援更改。

如果您只有一个用户 shell,请使用 chsh 将您的登录 shell 更改为仍在您的系统上运行的 shell (ksh),然后尝试运行“sudo chsh”。

如果您的 sudo 可以正常工作,您将有机会更改 root 的登录 shell。如果不是,请转到此文章的开头并按照说明从工作 shell(如 ksh)创建到 bash 的软链接,然后从那里获取它。

完成这些之后,你可以以 root 身份登录,并尝试使用你常用的包管理器来删除损坏的 bash 安装,然后安装或重新安装一个可以工作的版本,或者从源代码编译一个新的安装,或者在 slackware 的情况下,将 bash 包放在 / 中并提取它...瞧,即时 bash。可能有办法将 bash 从顶级目录提取到其他发行版的工作系统中,但我还没有尝试过。

请注意,某些安装程序在系统上安装一个可运行的 bash 时,最终会将一个可运行的 bash 可执行文件放在 /bin 中,但它未命名为 bash,在这种情况下,您必须将其链接到“bash”。最终,通过正确的删除安装周期组合,您将让它完成此操作,但我花了几轮尝试才让它自己完成此操作。最常见的是,我得到 /bin/bash4.new 作为可执行文件,我必须将其链接到 /bin/bash,然后才能使用常用的包管理器工具修复它。

如果您在没有 bash 的系统上从 ksh shell 运行包管理工具,您可能会收到一个命令未找到错误,即使以 root 身份,除非您使用“ksh apt-get”或“ksh installpkg”之类的命令专门调用它们,即使这样,也取决于您尝试安装的包....在这种情况下对我来说它是 bash,安装脚本在某些版本中失败,因为它需要 bash 来运行安装脚本....去想象。它本身的依赖关系。可以通过进入并重写安装脚本来修复,但真的谁愿意费心呢,做其他事情更容易。

您可能需要运行几轮安装卸载安装才能干净地完成它。

或者...在 slackware 中,我能够将 slack 包放入 / 然后提取它并在 /bin 中获得一个可运行的 bash 可执行文件

如果这些不起作用,您可以尝试删除 /bin 中所有死的 bash 可执行文件并获取 bash 源,然后从源代码编译/安装它。

或者您可能没有想到,但许多发行版都有一个重新配置实用程序,您可以从 CLI 调用它,这将允许您修改已安装的系统,或者您可以通过启动安装 CD/USB/媒体来执行此操作。这可能也有一种方法可以进入并修改您的系统。我从那里重新安装了 bash,或者通过从 CLI 调用它提供的重新配置程序。这在 debian 和 slackware 中有效。

最后,您可以启动与您的系统匹配的 Live CD,前提是您仍然具有相同的内核,然后 chroot 到您的系统并从那里使用常规包管理工具重新安装它。...我还没有测试过。

不管怎样,你最终可能希望新的 bash 是一个可以被你系统上的任何包管理器识别的包,否则编译新程序可能会抱怨他们找不到 bash(可能不会,但对于编写不佳的程序来说这是一个潜在的问题)

答案很长,但拥有一个无法启动的系统是一件可怕的事情,并且有几种方法可以解决这个问题。

相关内容