如何添加额外的登录步骤?

Flo*_*iOn 8 linux login authentication pam

我想要实现的是一个交互式程序,它在询问用户密码之前或之后运行,但除非成功退出,否则不会处理对计算机的访问。为了让它更容易理解,这里有一个例子:

我想访问我的计算机,首先输入我的用户名,然后是我的密码,然后正确回答一个简单的随机生成的数学问题。

为此,我使用以下系统身份验证文件:

auth      required  pam_unix.so try_first_pass nullok nodelay
auth      optional  pam_faildelay.so delay=600000
auth      optional  pam_exec.so stdout /home/math
auth      optional  pam_permit.so
auth      required  pam_env.so
Run Code Online (Sandbox Code Playgroud)

问题是,名为 math 的程序无法处理来自用户的输入,因为它会自动从 PAM 读取 EOF,这实际上使其无用。我还尝试了可疑行的以下变体,在这种情况下,它会读入密码,这也不是我想要的:

auth      optional  pam_exec.so stdout expose_authtok /home/math
Run Code Online (Sandbox Code Playgroud)

ste*_*eve 7

在 PAM 阶段没有标准输出/标准输入。您需要调用pam_conv(3)viapam_get_item(3)来执行 i/o。

ben.akrin.com 上的好示例,包括相关的 C 源代码示例。