我使用 (CentOS/RHEL) 虚拟机进行大量本地开发工作。我不想用默认 root 密码配置所有内容(如果暴露到网络,可能会出现问题),而是将它们配置为仅允许在串行控制台上进行无密码 root 登录。
ExecStart
我的第一次尝试是简单地使用以下选项将默认命令 替换[email protected]
为命令行--autologin
:
ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 --noclear --autologin root ttyS0 $TERM
虽然这会跳过login:
提示,但它仍然提示输入 root 密码。这似乎是 Linux 下程序的限制login
。
我还尝试用 shell 替换默认登录程序,如下所示:
ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 --noclear -n -l /bin/bash ttyS0 $TERM
但这与 selinux 发生冲突:虽然我得到了一个bash
shell,但它无法访问任何内容:
bash: /root/.bashrc: Permission denied
# ls /etc/systemd
ls: cannot open directory '/etc/systemd': Permission denied
在网络的其他地方,人们建议只从 中删除密码哈希/etc/{password,shadow}
,但这当然会导致一系列不同的问题:现在任何用户都可以su -
没有密码。
关于如何使其正常工作有什么想法吗?
答案1
经过一些实验,我得到了一些有用的东西:
运行并添加以下内容:
systemctl edit [email protected]
[Service] ExecStart= ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 --noclear --autologin root ttyS0 $TERM
这将导致用户
agetty
自动登录root
,但仅进行此更改,系统仍会提示您输入 root 密码。我们可以配置为在控制台上
/etc/pam.d/login
验证登录而无需密码。root
将以下内容添加到 的顶部/etc/pam.d/login
:auth sufficient pam_listfile.so item=tty sense=allow file=/etc/securetty onerr=fail apply=root
这将导致 PAM 堆栈检查 中的登录 tty
/etc/securetty
,并在找到它时跳过其他身份验证机制。将串口添加到
/etc/securetty
:# echo ttyS0 > /etc/securetty
完成这些更改后,启动时您将在串行控制台上看到以下内容:
CentOS Linux 8 (Core)
Kernel 4.18.0-80.11.2.el8_0.x86_64 on an x86_64
localhost login: root (automatic login)
Last login: Sun Nov 17 00:29:36 on ttyS0
[root@localhost ~]#
...如果您注销,您将立即返回 shell 提示符。
请注意,我在这里使用了文件名/etc/securetty
,在过去,它实际上做了其他事情(它控制root
允许登录的终端)。因此,如果这让您烦恼,请使用不同的文件:)。