假设我做了一件愚蠢的事情,例如使用“chsh”将 root 用户的 shell 更改为错误的文件路径。以后登录 root 帐户将突然失败,并引用 /bin/ 未找到的内容,并将您引导回登录屏幕。除非使用恢复模式或插入 LiveCD 来编辑 /etc/passwd,否则我可以选择哪些选项来恢复系统?我们还假设(为了好玩?)wheel 中没有其他用户。想法?
答案1
启动时,将init=/bin/bash
(或任何其他功能 shell 的路径)附加到启动选项 - 您将直接进入单个用户 shell。mount -o remount,rw /
在修改/etc/passwd
该环境中的条目之前,您可能需要执行以下操作。之后,只需重新启动或执行exec /sbin/init 3
.做就是了不是键入exit
或按 Ctrl+D,因为这会导致内核恐慌*。
在某些以两阶段模式(带有 initrd 映像)加载的系统上,可能需要此方法的另一种变体。如果您注意到启动选项包含init=
,最重要的是,real_init=
,那么放置的地方/bin/bash
应该是后一个参数(即real_init=/bin/bash
)。
* 这是因为在该环境中,shell 被内核视为初始化程序- 这是内核知道的唯一进程 - 它代表内核眼下的一个正在运行的系统。突然结束该进程,而不告诉内核关闭系统,必然会导致内核恐慌。 (如果周围突然一片漆黑,一片寂静,你不会惊慌吗?)
答案2
您可以使用su
并指定要执行的 shell(我不确定您是否试图暗示这在您关于没有其他用户在的注释中是不可能的wheel
):
su -c /bin/bash
否则,如果您的 ssh 守护进程允许登录 root,您可以执行类似的操作:
ssh root@localhost /bin/bash
例如,您还可以在引导加载程序中将 shell 设置为 initinit=/bin/ksh
或类似的。
答案3
如果您的引导加载程序配置为允许实时编辑内核参数,解决方案是重新启动并使用 shell 作为 init 进程,例如init=/bin/bash
。然后,安装需要手动安装的任何内容,然后编辑/etc/passwd
.sync
然后用你平常的方式再次启动init
。
答案4
上面的答案很好,我从阅读中学到了东西。如果您不记得这些方法的详细信息并且不介意重新启动,您始终可以使用 Live CD 发行版启动系统,安装 / 分区,然后编辑 /etc/passwd 并重新启动。不像上面的解决方案那么优雅,但更容易记住。