从将root的shell设置为错误文件中进行恢复


23

假设我走了,做了一件愚蠢的事情,例如使用'chsh'将根用户的shell更改为错误的文件路径。由于未找到/ bin /任何内容,以后无法登录到根帐户将突然失败,然后将您引导回到登录屏幕。如果不使用恢复模式或插入LiveCD来编辑/ etc / passwd,我有哪些恢复系统的选择?我们还假设(为了好玩?)方向盘上没有其他用户。有什么想法吗?


这是您提出的一种假设情况吗?
克里斯·

我确实在(相对较新的)FreeBSD安装上完全做到了这一点。此后已经重新安装了它,所以我认为它现在是某种假设,但是我很好奇,如果我确实拥有完整的系统,那么恢复的最佳途径是什么。
11

到那儿去,做了那件T恤。但是结果是,在我管理的每台计算机上,我都保留了一个备份根帐户,以防万一。
Mark D

Answers:


30

引导时,在引导选项后附加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被内核视为初始化程序(这是内核知道的唯一进程),它代表了内核眼中正在运行的系统。在不告诉内核关闭系统的情况下,突然结束该过程必须导致内核崩溃。(如果周围的所有事物突然变黑并且变得沉默,您会不会感到恐慌?)


不错exec,但是我想最好不要事先弄乱安装点。
斯蒂芬·吉梅内斯

2
@Stéph 如果内核未以读写方式挂载根目录,则必须这样做。否则,您将无法修改任何文件(包括/etc/passwd)。
rozcietrzewiacz 2011年

好想法!我曾经设法进入单用户模式,但是我并没有因为必须将其重新挂载为读/写来修改/ etc / passwd而感到震惊。谢谢!
11

@roz当然,我想说的是,/在执行init之前,我将卸载所有可能已安装的其他内容(除外)。
斯特凡希门尼斯

@Stéph坐骑应该没有问题。请注意,该/bin/bash操作恰好在该时间点运行,然后/sbin/init将在正常启动时执行。因此,系统当时无法执行任何可能的操作。
rozcietrzewiacz 2011年

10

您可以使用su并指定要执行的外壳程序(我不确定您是否试图暗示没有其他用户在这是不可能的wheel):

su -c /bin/bash

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

ssh root@localhost /bin/bash

例如,您也可以将一个shell设置为引导加载程序中的init init=/bin/ksh或类似名称。


1
好主意。=)如您所怀疑,没有其他用户可以使用'su'。sshd还禁用了root登录。
11

6

如果将引导加载程序配置为允许实时编辑内核参数,则解决方案是重新引导并使用Shell作为初始化过程,例如init=/bin/bash。然后,挂载需要手动挂载的所有内容,然后进行编辑/etc/passwdsync并用正常的方式重新启动init


哇,我刚刚注意到您在与我本人的同一分钟内发布了相同的答案:-)
rozcietrzewiacz 2011/09/28

6

如果您要问的要点是您已锁定所有成为root的方法,那么根据定义,您就不能成为root。

通常,有三种方法可以在Unix系统上成为root用户:

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

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


5

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


您应该指出与手动编辑/etc/passwd文件有关的风险。除此之外,要点-我只是想在回答中添加相同的建议。
rozcietrzewiacz 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.