5.18.9-arch1-1 指纹传感器:27c6:63ac 深圳市汇顶科技有限公司汇顶科技USB2.0杂项
我创建了一个 systemd 服务,当系统从休眠状态唤醒时,该服务运行 bash 脚本:
[Unit]
Description=User resume actions
After=hibernate.target
[Service]
User=marc
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/lock.sh
[Install]
WantedBy=hibernate.target
这是lock.sh:
#!/bin/bash
thisPid=$$
xsecurelock &
lock=$!
# loop until $lock is gone, or fingerprint is verified
until ! kill -0 $lock || fprintd-verify; do
echo "FAILURE"
done
#kill the pid for the lock and thisPid
kill $lock
kill $thisPid
该脚本生成 xsecurelock 并捕获其 pid。然后它运行 fprintd-verify 并阻塞,直到成功读取指纹。然后该脚本会杀死 xsecurelock 及其本身,我知道这是多余的。
systemd 服务运行良好。醒来后,xsecurelock 会生成,但我无法用指纹杀死它。
请注意,如果我手动执行lock.sh,它会完美运行。 xsecurelock 打开,我可以用我的指纹杀死它。但是,当我唤醒屏幕(触发触发 lock.sh 的 systemd 文件)时,屏幕会使用 xsecurelock 锁定,我可以输入密码来解锁它,但 fprintd-verify 失败。 systemctl 状态为:
Jul 07 12:33:49 manray lock.sh[6630]: failed to claim device: GDBus.Error:net.reactivated.Fprint.Error.PermissionDenied: Not Authorized: ne>
Jul 07 12:33:49 manray lock.sh[4760]: FAILURE
Jul 07 12:33:49 manray lock.sh[6634]: Using device /net/reactivated/Fprint/Device/0
Jul 07 12:33:49 manray lock.sh[6634]: failed to claim device: GDBus.Error:net.reactivated.Fprint.Error.PermissionDenied: Not Authorized: ne>
Jul 07 12:33:49 manray lock.sh[4760]: FAILURE
我怎样才能让 fprintd-verify 声明该设备。
编辑:当我将用户设置为 root 时,systemctl 状态:
Jul 07 13:14:43 manray systemd[1]: Starting User resume actions...
Jul 07 13:14:43 manray lock.sh[25997]: Authorization required, but no authorization protocol specified
Jul 07 13:14:43 manray lock.sh[25997]: 2022-07-07T17:14:43Z 25997 xsecurelock: Could not connect to $DISPLAY.
Jul 07 13:14:44 manray lock.sh[25998]: Using device /net/reactivated/Fprint/Device/0
Jul 07 13:14:44 manray lock.sh[25998]: ListEnrolledFingers failed: GDBus.Error:net.reactivated.Fprint.Error.NoEnrolledPrints: Failed to dis>
Jul 07 13:14:44 manray lock.sh[25996]: FAILURE
当以 root 身份运行时,xsecurelock 无法检测到显示屏,并且指纹传感器仍然无法工作。似乎没有注册根手指,我无法添加任何手指。
答案1
解决方案是在以下位置添加一条新规则/usr/share/polkit-1/rules.d/50-net.reactivated.fprint.device.verify.rules
:
polkit.addRule(function (action, subject) {
if (action.id == "net.reactivated.fprint.device.verify") {
return polkit.Result.YES
}
})
该规则始终允许 fprintd-verify 运行,而不管 polkit 身份验证(我认为)。
我不喜欢这个解决方案,因为它(似乎)不安全。