我可以在 tty 上激活密码反馈吗?

我可以在 tty 上激活密码反馈吗?

几周前,我决定清理键盘,结果在将几个键重新装回板上时弄乱了它们。结果,某些字符变得非常难以输入......显然我在密码中使用了其中的一些字符。

当然,我计划更换我的键盘,但与此同时,每天必须在我的 ttys 上进行 4-5 次登录尝试开始让我感到不安(我不使用桌面管理器)。

我已经通过在配置pwfeedback中进行设置来稍微缓解这个问题sudo。这使我能够在键盘跳过字符时“看到”。但是我找不到agettylogin组合的类似选项。

有没有办法激活 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参数promptPAM_AUTHTOKfor 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_itempam_set_item函数向我们介绍了pam_conv结构定义这里

现在,查找有关默认 PAM 会话功能的信息比应有的要困难得多(我认为)。我所看到的所有结构都仍未初始化,并且pam_unix似乎没有定义自己的结构。不过我设法找到了通用的misc_conv函数,它传递PAM_PROMPT_ECHO_OFFread_string和...这里是 PAM 停用输入反馈的地方。

结论:没有密码反馈是硬编码的。太糟糕了。一点挖掘让我这个 GitHub 问题这个 Arch BBS 主题。显然,该功能可用当 PAM 还不是身份验证标准时。我想不再实施它是有道理的——安全性和所有——但你知道,有一个选择会很好。

不管怎样,我刚刚订购了我的新键盘。

相关内容