从将 root 的 shell 设置为坏文件中恢复

nof*_*fle 25 shell users login

假设我做了一件愚蠢的事情,例如使用“chsh”将 root 用户的 shell 更改为错误的文件路径。以后登录到 root 帐户将突然失败,引用 /bin/whatever 未找到,然后将您引导回登录屏幕。除非使用恢复模式或插入 LiveCD 来编辑 /etc/passwd,我有哪些选项可以恢复系统?我们还假设(为了好玩?)轮子中没有其他用户。想法?

roz*_*acz 31

启动时,将init=/bin/bash(或任何其他功能外壳的路径)附加到您的启动选项 - 您将直接进入单个用户外壳。您可能需要mount -o remount,rw /在修改该/etc/passwd环境中的条目之前执行此操作。之后,只需重新启动或执行exec /sbin/init 3。只是不要不键入exit或按Ctrl + d,因为这些会导致内核恐慌*。

在某些以两阶段模式(带有 initrd 映像)加载的系统上,可能需要此方法的另一种变体。如果您注意到引导选项包含init=并且最重要的是real_init=,那么放置的位置/bin/bash应该是后一个参数(即real_init=/bin/bash)。

* 这是因为在那个环境中,shell 被内核视为init 程序——这是内核知道的唯一进程——它代表内核眼中的一个正在运行的系统。突然结束该进程,而不告诉内核关闭系统,一定会导致内核恐慌。(如果周围突然一片漆黑,你会不会惊慌失措?)

  • @Stéph 如果你的内核没有挂载 root 读写,你 *必须* 这样做。否则你将无法修改任何文件(包括`/etc/passwd`)。 (2认同)

Chr*_*own 10

您可以使用su并指定一个 shell 来执行(我不确定您是否试图暗示这是不可能的,因为您的注释中没有其他用户在wheel):

su -c /bin/bash
Run Code Online (Sandbox Code Playgroud)

否则,如果您的 ssh 守护程序允许登录到 root,您可以执行类似的操作:

ssh root@localhost /bin/bash
Run Code Online (Sandbox Code Playgroud)

例如,您还可以将 shell 设置为引导加载程序中的 initinit=/bin/ksh或类似内容。


Sté*_*nez 6

如果您的引导加载程序配置为允许实时编辑内核参数,则解决方案是重新启动并使用 shell 作为 init 进程,例如init=/bin/bash. 然后,手动挂载任何需要挂载的东西,然后编辑/etc/passwd. sync并用你平常的init.


Gil*_*il' 6

如果您的问题的要点是您已经锁定了成为 root 的所有方式,那么根据定义,您无法成为 root。

在 unix 系统上允许三种方式成为 root 是很常见的:

  • 以 rootroot身份登录,方法是在登录提示处输入并键入 root 密码。这将运行 root 的 shell。
  • 以普通用户身份登录,然后通过运行su并输入 root 密码成为 root 。在某些系统上,这需要在特定的组中(通常称为wheel);在其他系统上,任何知道 root 密码的人都可以成为 root。使用 PAM 进行身份验证的系统用于pam_wheel管理轮组(如果有的话)。如果使用 指定命令su -c,它将通过 root 的 shell 执行。
  • 以普通用户身份登录,然后通过运行sudo并输入您自己的密码成为 root 。用户帐户必须已被管理员授予 sudo 权限。除非在sudoers文件中受到限制,否则您可以运行任何命令,而不管 root 的 shell。

防止 root 的 shell 不可用的传统方法是定义另一个具有 UID 0 和不同 shell(toor是传统名称)的帐户。例如,如果 root 的 shell 是一个动态链接的可执行文件(节省内存的好主意)并且库升级出错,则 root 的 shell 可能无法使用。备用 root 帐户将有一个静态链接的可执行文件,可能是一个内置通用实用程序的可执行文件,例如BusyBox。


Joe*_*Joe 5

上面的答案很棒,我从阅读中学到了。如果您不记得这些方法的详细信息并且不介意重新启动,您始终可以使用 live CD 发行版引导您的系统,挂载 / 分区,然后编辑 /etc/passwd 并重新启动。不像上述解决方案那么优雅,但更容易记住。