我正在尝试,并尝试简化/强化我的 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系统的。
答案1
这种行为很容易解释,可以追溯到几十年前的 Unix 的第一个版本。 getty
打印第一个登录提示,但如果身份验证失败,程序将打印第二个和后续提示login
,getty
此时该提示已覆盖自身。
该login
程序在退出之前对登录尝试的次数有限制,并让登录服务由进程 #1 重新生成。在具有远程真实终端的系统上,这会关闭终端设备,导致其将 DTR 设置为零,进而导致连接的调制解调器断开连接。这个想法是为了让通过远程连接暴力破解密码和帐户变得困难。 (它取决于多个电话呼叫,即使按当地费率,这对攻击者来说也是昂贵的。)还有一个不活动计时器会导致同样的事情。 (这个想法有些不同;为了防止电话电路被尚未登录会话的远程终端无限期地分配。)
在虚拟终端上,或者在真实终端上当地的,没有调制解调器,没有电话线,也没有可掉线的运营商;这些重复登录提示和设置看门狗的机制基本上是毫无意义的。 login
可以简单地无限期地等待,没有看门狗,并且便宜地退出并回收登录服务每一个验证失败。但他们仍然存在并且仍然受雇。
不幸的是,虽然agetty
util-linux 中的程序允许您至少配置提示的这一部分,但login
Shadow 中的程序却不允许。 它的登录提示被硬连线到程序代码中。
请注意,这并不普遍。例如,在 FreeBSD 系统上,程序发出的提示login
可以通过login_prompt
中的设置进行配置/etc/login.conf
。