进一步阅读

进一步阅读

我正在尝试,并尝试简化/强化我的 tty 登录提示以显示最少的系统信息。我修改了/etc/issue/etc/motd为空,并感动了~/.hushlogin。这几乎清除了所有东西!

我的登录体验如下:

hostname login: user
Password:
user@hostname:~$ 

我不喜欢它在登录提示符下显示主机名,所以我追查了它。这让我的手册页agetty,我修改了服务文件:

/lib/systemd/system/[email protected], 和

/lib/systemd/system/[email protected],

将选项添加--nohostname到 ExecStart 行,如下所示:

[Service]
ExecStart=-/sbin/agetty --nohostname --keep-baud 115200,38400,9600 %I $TERM

这效果很好,除了,当用户输入错误的密码时。然后它恢复到旧的提示符并显示主机名。

登录成功:

login: user
Password:
user@hostname:~$

登录失败:

login: user
Password:

Login incorrect
hostname login:

更奇怪的是,如果我在错误登录后让控制台无人看管约 60 秒,则会打印出一半的“登录”一词,它会暂停,然后显示正确的登录提示。

login: user
Password:

Login incorrect
hostname login:
Log
login:

有什么想法可以解释这种行为吗?我查看了agetty的源代码,然后查看了shadow(login.c)的源代码,我可以看到失败后重新显示登录提示的位置,但它引用了PAM,我不太明白那部分Linux系统的。

2015 年 CentOS 也报告了此问题

答案1

这种行为很容易解释,可以追溯到几十年前的 Unix 的第一个版本。 getty打印第一个登录提示,但如果身份验证失败,程序将打印第二个和后续提示logingetty此时该提示已覆盖自身。

login程序在退出之前对登录尝试的次数有限制,并让登录服务由进程 #1 重新生成。在具有远程真实终端的系统上,这会关闭终端设备,导致其将 DTR 设置为零,进而导致连接的调制解调器断开连接。这个想法是为了让通过远程连接暴力破解密码和帐户变得困难。 (它取决于多个电话呼叫,即使按当地费率,这对攻击者来说也是昂贵的。)还有一个不活动计时器会导致同样的事情。 (这个想法有些不同;为了防止电话电路被尚未登录会话的远程终端无限期地分配。)

在虚拟终端上,或者在真实终端上当地的,没有调制解调器,没有电话线,也没有可掉线的运营商;这些重复登录提示和设置看门狗的机制基本上是毫无意义的。 login可以简单地无限期地等待,没有看门狗,并且便宜地退出并回收登录服务每一个验证失败。但他们仍然存在并且仍然受雇。

不幸的是,虽然agettyutil-linux 中的程序允许您至少配置提示的这一部分,但loginShadow 中的程序却不允许。 它的登录提示被硬连线到程序代码中。

请注意,这并不普遍。例如,在 FreeBSD 系统上,程序发出的提示login可以通过login_prompt中的设置进行配置/etc/login.conf

进一步阅读

相关内容