在Linux中,指纹认证通过PAM实现。有一个名为pam_fprintd.so的模块与fprintd服务进行通信。当fprintd服务无法工作时,pam_fprintd无法与其通信,PAM认证会跳过配置中的下一个模块。但是另一个PAM模块也可能跳过pam_fprintd。
假设您的/etc/pam.d/system-auth文件包含以下内容:
auth sufficient pam_fprintd.so
auth required pam_unix.so
您的实际配置可能会有所不同,甚至位于不同的位置,但关键是 pam_fprintd 和 pam_unix,它们负责密码验证。
您可以在配置中添加另一个条目,在 pam_fprintd.so 之前跳过该模块,以便在关闭笔记本电脑盖子时跳过该模块。一种方法是通过 pam_exec.so 模块来实现。创建一个可执行脚本 /usr/local/bin/pam_check_lid,内容如下:
#!/bin/sh
LID_STATE=$(cat /proc/acpi/button/lid/LID/state | cut -d':' -f2 | tr -d ' ')
case ${LID_STATE} in
closed)
echo closed
exit 1
;;
open*)
echo open
exit 0
;;
*)
# LID is open by default
echo unknown
exit 0
;;
esac
重要: 确保此文件不可全局写入。否则,您可能会在系统中引入安全漏洞。此外,您可以通过 DBus 检查 LID 状态,详细信息请查看this。
然后,在pam_fprintd之前添加以下行:
auth [success=ignore default=1] pam_exec.so quiet /usr/local/bin/pam_check_lid
所以你的配置应该是这样的:
auth [success=ignore default=1] pam_exec.so quiet /usr/local/bin/pam_check_lid
auth sufficient pam_fprintd.so
auth required pam_unix.so
现在PAM身份验证将在尝试指纹验证之前执行您的脚本,如果您的脚本返回非零退出代码(失败),它将执行默认操作,跳过PAM配置中的1个条目(因此它会跳过pam_fprintd到下一个身份验证模块pam_unix)。当LID打开时,它将返回0退出代码,成功时不会执行任何操作,因为配置中有“ignore”关键字。
另外,您可以使用与脚本相同行为的自己制作的PAM模块,而不是使用带有脚本的pam_exec.so。
关于调试和实际实现的一些建议。如果您在使用pam_exec时遇到问题,可以添加像debug和log这样的调试选项,详细信息请参考pam_exec文档documentation。另外,建议您在新的PAM配置上测试更改,而不是修改现有的配置,因为配置文件中的错误可能会导致您无法登录到您的帐户。例如,您可以将system-auth复制为system-auth-new,并在system-auth-new上进行更改和测试,然后在测试通过后再替换原来的配置文件。对于测试,您可以使用pamtesterpamtester。例如:
cp /etc/pam.d/system-auth /etc/pam.d/system-auth-new
# UPDATE /etc/pam.d/system-auth-new
pamtester system-auth-new YOUR_USER_NAME authenticate
当它按预期工作时,用您的新配置替换system-auth。
/sys/class/drm/card0-DP-1/status。不过,这篇文章真是太棒了 - 谢谢! - Richard Vodden