您将希望使用LinuxPAM来允许您使用面部识别进行Su/Sudo。我用python+bash脚本完成了这项工作:https://github.com/lambrou/susentry
我已经完成了自述的一部分,并将结合你的问题向你解释。在
您需要做的第一件事是制作一个bash脚本来调用python脚本。在#!/bin/bash
# You must change the value /path/to/susentry.py to the path of your
# python file.
export DISPLAY=:0.0
xhost +local:
python3 /path/to/susentry.py -l # run the python script for facial recognition
exit_status=$? # This grabs the exit status of the python script we just ran
if [ "${exit_status}" -ne 0 ]; # checks to see if exit status is anything other than 0
then
echo "exit ${exit_status}"
exit 1 # exit status 1 on python script fail (exit 1)
fi
echo "EXIT 0"
exit 0 # exit 0 if we get to this line
这个脚本的作用是将显示设置为您的显示,因为PAM模块将从不同的用户空间调用脚本,我们需要告诉它您的显示在哪里,以及您使用的xhost是什么。然后,它获取python脚本的退出状态(确保在面部识别失败时退出1,通过退出0),并将其传递给PAM,让PAM知道脚本是否通过或失败。
查找此行:
Python3/路径/目的地/suentry.py-我
改变/路径/到/suentry.py到python脚本的完整路径。然后,将这个文件放在/usr/local/bin文件夹中。在
接下来,我们修改PAM common auth文件:
^{pr2}$
在公共身份验证文件中查找以下行:auth [success=1 default=ignore] pam_unix.so nullok_secure
这一行调用向用户请求密码的模块。如果成功,则跳过下一行(如果成功,则跳过一行)。如果验证成功,目标是跳过以下行:auth requisite pam_deny.so
因为这一行拒绝用户访问权限。
因此,如果您想使用su/sudo,但您不需要输入密码而是使用面部比较,请在上面的一行中添加以下内容:auth [success=2 default=ignore] pam_exec.so debug log=/path/to/pamlogs.txt /usr/local/bin/susentry
确保更改/路径/到/pamlogs.txt保存PAM输出的位置。(这个输出是来自PAM、bash脚本和python脚本的错误输出和stdin输出)
让我们把它分解。在
auth [success=2 default=ignore]
意思是“如果这个程序返回成功(退出0),则跳过接下来的2行。(密码提示行、验证失败行)
pam_exec.so debug log=/path/to/pamlogs.txt
这部分说“使用pam_exec来执行bash脚本,并将所有错误日志/stdin日志发送到/path/to/pamlogs.txt在
/usr/local/bin/susentry
这部分是bash脚本的位置。这就是PAM exec运行并等待退出代码的原因。在
如果面部识别脚本失败,则应返回请求密码。
请注意,编辑/etc/pam.d/common-auth时需要小心,因为这样会破坏sudo。您可能希望在处理这些内容时使用root权限打开一个新的终端,以便恢复更改。