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