如何永久禁用恢复模式的 root 密码提示,RHEL7

Oth*_*eus 10 startup login rhel centos systemd

注意:我在这里询问了有关这些捆绑包的第 6 版的类似问题。请注意,7 使用 systemd 并且可能有不同的实现

在极少数情况下,RHEL 或 CentOS 7 系统因(例如)不当关机或启动时强制 fsck-check 失败而无法启动,控制台会提示用户输入 root 密码。

如何禁用密码检查并直接删除到 root-shell?

不可接受的答案:

  • 覆盖init内核命令行(即 grub)
  • 用/sbin/sushell 链接/替换/sbin/sulogin。(这会起作用,但它会引发安全框架的危险信号)。
  • 从其他设备启动

Adr*_* M. 11

Systemd 正在处理服务目标。目标相当于运行级别,服务相当于初始化脚本。大多数systemd配置的位于/usr/lib/systemd,而标准的init是/etc/{init.d,rc*.d,inittab}

当在启动过程中的问题踢(默认是getty.targetgraphical.target,你可以让他们用systemctl get-default)systemd被切换到emergency.target

这个“紧急”目标将依次加载文件emergency.service。该服务包含多行,其中:

...
[Service]
Environment=HOME=/root
WorkingDirectory=/root
ExecStartPre=-/bin/plymouth quit
ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" to try again\\nto boot into default mode.'
ExecStart=-/bin/sh -c "/sbin/sulogin; /usr/bin/systemctl --fail --no-block default"
...
Run Code Online (Sandbox Code Playgroud)

我们只需要替换对 的调用/sbin/sulogin

ExecStart=-/bin/sh -c "/sbin/sushell; /usr/bin/systemctl --fail --no-block default"
Run Code Online (Sandbox Code Playgroud)

我们将直接进入 shell,而不是通过 sulogin 提示输入密码。(我们可以使用/bin/sh,但/sbin/sushell与 CentOS6/RHEL6 的答案一致。实际上,sushell只是$SUSHELL默认为exec 的/bin/bash。)

要使此更改“永久”,即不受yum更新影响,请更改此文件的副本并将其放入/etc/systemd/system/. 另外,要使“救援模式”以相同的方式工作,请将rescue.service. 这是一个用于简化过程的 shell/sed 脚本:

for SERVICE in rescue emergency ; do 
   sed '/^ExecStart=/ s%"/sbin/sulogin;%"/sbin/sushell;%' /usr/lib/systemd/system/$SERVICE.service > /etc/systemd/system/$SERVICE.service
done
Run Code Online (Sandbox Code Playgroud)

要对此进行测试,请确保系统未在使用中,并告诉systemd切换到rescue目标:

systemctl rescue
Run Code Online (Sandbox Code Playgroud)

这将关闭网络连接并在控制台打开一个 shell。您可以使用emergency目标进行测试,但这并没有那么干净(出于某种原因),并且可能需要完全重新启动才能退出。

您还可以从引导菜单 (grub) 测试这些。对于测试紧急模式,这很容易。启动,当你得到菜单时,点击“e”进行编辑,然后使用方向键导航到以开头的行linux16并追加(点击CTRL-A到行尾)emergency

linux16 ... emergency
Run Code Online (Sandbox Code Playgroud)

对于测试救援模式,步骤与上述相同,但您必须更明确:

linux16 ... systemd.unit=rescue.target
Run Code Online (Sandbox Code Playgroud)