我在玩,并试图简化/强化我的 tty 登录提示以显示最少的系统信息。我将我的/etc/issue
and修改/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系统的。
这种行为很容易解释,可以追溯到几十年前 Unix 的最初版本。
getty
打印第一个登录提示,但如果身份验证失败,则程序会打印第二个和后续提示,此时login
程序getty
已经覆盖了自己。该
login
程序在退出之前对登录尝试的次数有限制,并让登录服务由进程#1 重新生成。在具有远程真实终端的系统上,这将关闭终端设备,导致其将 DTR 设置为零,进而导致连接的调制解调器断开连接。这个想法是通过远程连接的蛮力来使猜测密码和帐户变得困难。(它相当依赖于多次电话呼叫,即使是本地费率,对攻击者来说也是昂贵的。)还有一个不活动计时器会导致同样的事情。(这个想法有些不同;防止电话线路被还没有登录会话的远程终端无限期地分配。)在虚拟终端上,或者在本地的真实终端上,没有调制解调器,没有电话线,也没有运营商可以掉线;而这些重复登录提示和设置看门狗的机制在很大程度上是没有意义的。 可以简单地在没有看门狗的情况下无限期地等待,并在每次身份验证失败
login
时廉价地退出并回收登录服务。但是它们仍然存在并且仍然被使用。不幸的是,虽然
agetty
来自 util-linux 的程序允许您至少配置提示的这一部分,但login
来自 shadow 的程序却不允许。 它的登录提示硬连线到程序的代码中。请注意,这不是通用的。
login
例如,在 FreeBSD 系统上,程序发出的提示可以通过login_prompt
./etc/login.conf
进一步阅读
login.conf
. FreeBSD 文件格式手册。2011-07-08。