![如何从上次运行的 PAM 模块获取身份验证状态](https://linux22.com/image/52698/%E5%A6%82%E4%BD%95%E4%BB%8E%E4%B8%8A%E6%AC%A1%E8%BF%90%E8%A1%8C%E7%9A%84%20PAM%20%E6%A8%A1%E5%9D%97%E8%8E%B7%E5%8F%96%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E7%8A%B6%E6%80%81.png)
如果我有以下 PAM 堆栈:
auth required default_pam.so
auth requisite my_custom_pam.so
....
如何从上次/上一个 PAM 模块运行中获取身份验证状态以在您自己的自定义 PAM 身份验证模块(例如在函数中pam_sm_authenticate
)中使用?
答案1
首先,请记住,让模块的代码逻辑根据其他模块的结果进行更改是相当不传统的:这通常是通过使用控制标志来完成的,例如required
和requisite
,它们控制在哪种情况下调用哪些模块(即根据当前链状态、之前模块的结果)。考虑到这一点,您可以想象以这种方式调整模块的行为:
auth [success=1] default_pam.so
auth [success=done default=die] my_custom_pam.so default_failed
auth requisite my_custom_pam.so
该链具有以下逻辑:
- 如果默认模块成功,则将其标记为已验证(由 暗示
success=1
)并跳过 1 个模块。链到达my_custom_pam
调用时不带任何参数,这必须成功 (requisite
)。 - 如果默认模块失败,请不要跳过任何内容。链到达
my_custom_pam
,用参数调用,default_failed
。该链将在该模块(done
或die
)之后停止,并将决定总体结果。
这里,关键元素是传递给 的参数my_custom_pam
。通过检查您的argc
例程,您将能够根据当前的链状态调整您的逻辑。argv
pam_sm_authenticate