我在我的一台服务器上做出了一个非常糟糕的决定。
我删除了/bin/sh
。我重新启动了服务器,但服务器无法运行,因为它需要/bin/sh
启动 rc 脚本。我也无法访问单用户模式,因为需要 sh。
有没有什么简单的方法可以重新安装 bourn shell?
我尝试从 live cd 复制 sh,但在 ld-elf.so.1 库上失败。因此,我将其从 livecd 复制到我的 / 分区的 /libexec。然后它需要 libedit.so 库,我将其复制到 /libexec,但这次不起作用。
我尝试了符号链接/usr/local/bin/bash
,但仍然出现“找不到 sh”类型的错误。我猜是因为/usr
尚未安装,因为它是通过 rc 脚本完成的。
任何帮助是极大的赞赏。
答案1
您需要将 /bin/sh 替换为某物;这是关键。如果您可以在启动期间进入 FreeBSD 加载程序(出现“ok”提示),请尝试以下操作:
set init_shell=/bin/csh
unset init_script
unset init_path
我从装载机(8)来自 FreeBSD 手册页(在线)。我还没有这样做过,但它应该可以工作(假设 /bin/csh 存在并且可以执行)。
如果您在其他地方启动并运行 FreeBSD 8.2 服务器,您可以尝试从该源窃取 /bin/sh 并将其放入需要的系统中。
或者,获取静态构建的 /bin/sh 并将其放入;静态构建的二进制文件不会出现任何库问题。
编辑:我应该指出:如果您启动到 /bin/csh,您仍然需要获取一些可以代替 /bin/sh 的东西。您可以通过互联网获取它,也可以从另一张 CD 或软件包或其他东西中复制它;使用 /bin/csh 启动可以进入机器。通过网络复制需要您启动网络;否则,请从 CDROM 复制。
将来避免此类情况发生的最佳方法是:
- 不要从/bin 中删除!(这是最简单的部分)
- 有一个静态构建的 /bin/sh,没有动态链接。
- 有一个备份 sh,例如 /bin/sh.static。
三者全部做。
答案2
好的,首先是讲座:
不要弄乱系统二进制文件
/bin
和FreeBSD 上 的任何内容都应保留。即使您知道自己在做什么(如果您知道/sbin
自己/rescue
在做什么,您也知道这些内容应保留。它们真的很重要 - 全部!)不删除
/bin/sh
。 曾经。在任何*NIX 系统有这个功能。
真的。不要这么做。很多脚本依赖于/bin/sh
Bourne Shell。它打破了宇宙。
如果你真的想要,你可以安全地用复制就像bash
Adam Z 建议的那样,但如果你要这么做,你可能需要静态链接该副本bash
——它引入了许多库,您可能直到系统启动并/usr/local
安装后才拥有这些库。
那么,该如何收拾残局呢?有两个选择:
选项 1:有些痛苦
前往http://www.freesbie.org/(或者您选择的 FreeBSD LiveCD - 您甚至可以使用来自http://www.freebsd.org为此)。获取 LiveCD,刻录并启动它。
进入 LiveCD 环境后,安装损坏的系统的根分区,将其/bin/sh
从 LiveCD 复制到您的机器,然后重新启动。
这应该让您恢复正常运行——您可能需要按照以下说明进行操作重建“世界”/bin/sh
,或者至少从与您的运行系统匹配的源代码树重新编译。
选项 2:更省事,不用 LiveCD
如果您身边有另一个可以利用的 FreeBSD 机器(或者可以通过其他方式获取 的副本)/bin/sh
,请将您的 FreeBSD 机器设置为单用户模式。配置网络(或安装任何具有替换 shell 的介质),然后将其复制到它应该在的位置。
/bin/sh
重新启动,你就应该没问题了 —— 但如果你获取的不是来自相当接近相同的机器,则需要注意与 LiveCD 相同的事项。
答案3
不要使用符号链接,而是将您的复制bash
到/bin/sh
。使用ldd
命令查找可能驻留在 rootfs 以外的文件系统上的任何库,并将它们也复制到 rootfs 中。