几周前,我决定清理键盘,结果在将几个键重新装回板上时弄乱了它们。结果,某些字符变得非常难以输入......显然我在密码中使用了其中的一些字符。
当然,我计划更换我的键盘,但与此同时,每天必须在我的 ttys 上进行 4-5 次登录尝试开始让我感到不安(我不使用桌面管理器)。
我已经通过在配置pwfeedback
中进行设置来稍微缓解这个问题sudo
。这使我能够在键盘跳过字符时“看到”。但是我找不到agetty
和login
组合的类似选项。
有没有办法激活 tty 登录提示的密码反馈?
答案1
好吧,我们开始看源代码!
util-linux
当我的登录提示出现时, 的login
程序正在负责。开始吧那里,更具体地说,在login-utils/login.c
文件。
现在,login
似乎负责login
提示,因为它是在loginpam_get_prompt
并将其注册到 PAMinit_loginpam
。这loginpam_auth
然后函数接管,控制权交给 PAMpam_authenticate
功能。这意味着login
仅定义用户名提示,仅此而已。
那么对 PAM 来说:我们感兴趣的事情显然发生在pam_authenticate
:
pam_authenticate 函数用于验证用户身份。根据身份验证服务,用户需要提供身份验证令牌,通常是密码,但也可以是指纹。
现在,基于影子的身份验证 ( /etc/passwd
、/etc/shadow
) 由该模块处理pam_unix
。我的发行版 (Arch) 通过以下方式提供 PAMpam
包裹,这意味着我们的旅程将继续到linux-pam.org和它的源代码。modules/pam_unix/pam_unix_auth.c
似乎是一个很好的起点。 PAM 模块通过pam_sm_authenticate
我们发现的函数提供其身份验证机制这里。密码(或“身份验证令牌”,见上文)是通过以下方式获取的一个电话到 PAM 的pam_get_authtok
功能。它是在security/pam_ext.h
头文件,这就是我们下一步要做的地方。
extern int PAM_NONNULL((1,3))
pam_get_authtok (pam_handle_t *pamh,
int item,
const char **authtok,
const char *prompt);
这些论点中没有什么太有希望的,但是好吧......让我们看看定义。pam_unix
通过了NULL
参数prompt
和PAM_AUTHTOK
for item
,所以我们最终得到这里。现在,硬编码对我PAM_PROMPT_ECHO_OFF
来说pam_prompt
看起来不太好......
retval = pam_prompt (pamh, PAM_PROMPT_ECHO_OFF, &resp[0], "%s", PROMPT);
顺便说一下,密码PROMPT
也是硬编码的(这里),所以我的一个更奇特的密码提示的梦想就破灭了……无论如何,让我们来看看pam_prompt
功能。实际出现的提示是这里,其中 PAM 调用对话函数并获取几行多于。快速浏览一下的pam_get_item
和pam_set_item
函数向我们介绍了pam_conv
结构定义这里。
现在,查找有关默认 PAM 会话功能的信息比应有的要困难得多(我认为)。我所看到的所有结构都仍未初始化,并且pam_unix
似乎没有定义自己的结构。不过我设法找到了通用的misc_conv
函数,它传递PAM_PROMPT_ECHO_OFF
给read_string
和...这里是 PAM 停用输入反馈的地方。
结论:没有密码反馈是硬编码的。太糟糕了。一点挖掘让我这个 GitHub 问题和这个 Arch BBS 主题。显然,该功能可用当 PAM 还不是身份验证标准时。我想不再实施它是有道理的——安全性和所有——但你知道,有一个选择会很好。
不管怎样,我刚刚订购了我的新键盘。