假设我走了,做了一件愚蠢的事情,例如使用'chsh'将根用户的shell更改为错误的文件路径。由于未找到/ bin /任何内容,以后无法登录到根帐户将突然失败,然后将您引导回到登录屏幕。如果不使用恢复模式或插入LiveCD来编辑/ etc / passwd,我有哪些恢复系统的选择?我们还假设(为了好玩?)方向盘上没有其他用户。有什么想法吗?
假设我走了,做了一件愚蠢的事情,例如使用'chsh'将根用户的shell更改为错误的文件路径。由于未找到/ bin /任何内容,以后无法登录到根帐户将突然失败,然后将您引导回到登录屏幕。如果不使用恢复模式或插入LiveCD来编辑/ etc / passwd,我有哪些恢复系统的选择?我们还假设(为了好玩?)方向盘上没有其他用户。有什么想法吗?
Answers:
引导时,在引导选项后附加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
,但是我想最好不要事先弄乱安装点。
/etc/passwd
)。
/
在执行init之前,我将卸载所有可能已安装的其他内容(除外)。
/bin/bash
操作恰好在该时间点运行,然后/sbin/init
将在正常启动时执行。因此,系统当时无法执行任何可能的操作。
如果将引导加载程序配置为允许实时编辑内核参数,则解决方案是重新引导并使用Shell作为初始化过程,例如init=/bin/bash
。然后,挂载需要手动挂载的所有内容,然后进行编辑/etc/passwd
。sync
并用正常的方式重新启动init
。
如果您要问的要点是您已锁定所有成为root的方法,那么根据定义,您就不能成为root。
通常,有三种方法可以在Unix系统上成为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)。
上面的答案很棒,我是从阅读中学到的。如果您不记得这些方法的详细信息并且不介意重新启动,则始终可以使用实时CD发行版来启动系统,挂载/分区,然后编辑/ etc / passwd并重新启动。不如上述解决方案优雅,但更容易记住。
/etc/passwd
文件有关的风险。除此之外,要点-我只是想在回答中添加相同的建议。