1. 在 Debian 12 上装 howdy 之前,先想清楚它替代的是哪一段流程
把 howdy、Debian 12、面部识别、红外这几个词凑在一起,很多人第一反应是"照着某个脚本跑一遍就完事"。真实情况是,howdy 本身不复杂,复杂的是它要插进去的那条认证链路——PAM。我见过不少人装完之后 sudo 用不了、锁屏进不去、只能进恢复模式救回来。所以动手之前先把"它到底替代了什么"捋清楚,比背命令重要得多。
这篇内容适合三类人看:第一类是把主力机换成 Debian 12 stable、又实在懒得每次敲密码的人;第二类是手上有带红外模组的笔记本,想让 Linux 也有类似 Windows Hello 那种"掀盖即解锁"体验的人;第三类是已经装过 howdy 但被各种黑屏、空帧、误识别折腾过,想找一条完整排查路径的人。基础好不好都能看,我会把关键命令和参数都写出来,也会解释每个参数为什么这么设。
先说结论:howdy 在 Debian 12 上是能跑通的,普通 RGB 摄像头和红外模组都能用,但它不是"Windows Hello 的 Linux 移植版",两者在安全模型上有本质差别,后面第 6 章会专门讲这个。带着"它只是个方便工具,不是安全增强"的预期去装,心态会平很多。
1.1 Windows Hello 的链路由哪几段组成,howdy 只接了中间一段
Windows Hello 面部识别在系统内部大致是四段:摄像头采集(红外为主、彩色为辅)、活体检测(判断是真脸还是照片/屏幕)、特征比对(跟已注册模板比对)、认证结果回传给登录子系统。红外在这里的作用不是"看得更清楚",而是靠红外反射特性做初步的活体判断——纸质照片和手机屏幕在红外下反射率和纹理跟真人皮肤差别很大。
howdy 只做了第二段和第三段的一半:它用 OpenCV 抓帧、用 dlib 的人脸检测器和 ResNet 特征模型做人脸编码,然后跟训练样本做欧氏距离比较,小于阈值就返回成功。它没有真正的活体检测模块,也没有红外专用算法。红外模组在 howdy 这里的作用,更多是"在完全黑暗环境下也能拿到一张可用的灰度人脸图",而不是防伪。
理解这一点的意义在于:你不会去纠结"为什么我拿张打印照片对着红外也能解锁",因为设计上它就没打算拦这个。反过来说,如果你要的是防照片攻击,需要叠加其他手段,比如要求密码作为第二因素、或者只在特定场景(比如 sudo 提权)启用。
1.2 Debian 12 stable 与常见教程环境的三个差异
网上大部分 howdy 教程写于 Ubuntu 20.04/22.04 时期,直接照搬到 Debian 12 会撞上三处差异。
第一处是 Python 版本。Debian 12 自带 Python 3.11,howdy 的某些老分支在pam.py里对distutils有隐式依赖,而 3.12 之后distutils被移除,3.11 还算安全,但如果你手动装过新版 Python 并改了默认解释器,PAM 加载脚本时可能找不到模块。建议保持系统 Python 为默认,不要在这台机器上乱切 pyenv。
第二处是 PAM 模块路径。Debian 系的 PAM 模块放在/lib/x86_64-linux-gnu/security/,而很多教程里写的是/lib/security/或/usr/lib/security/。写 PAM 配置时如果路径不对,表现是"输密码时毫无反应、也不报错",非常难查。
第三处是 dlib 的获取方式。Ubuntu 教程常让人pip install dlib从源码编译,Debian 12 的软件源里直接有python3-dlib,用它比源码编译省事得多,也不会因为内存不足在中途被 OOM killer 干掉。这一点在第 3 章会展开。
把这三处差异先记住,后面配置时遇到"明明按教程做了却不行",先回来对一遍。
2. 先把摄像头摸清楚:设备节点、像素格式与红外通道
装软件之前必须先把硬件摸清楚,这一步偷懒,后面所有问题都会被误判成"howdy 有 bug"。我见过最典型的案例:某人对着/dev/video0调了半天,结果那个节点是摄像头的 metadata 接口,根本不输出图像帧,真正出图的是/dev/video2。
Linux 下 UVC 摄像头(绝大多数 USB 摄像头和笔记本内置摄像头都属于这一类)有个特点:一个物理设备会注册出多个 video 节点。通常采集节点是第一个,后面的可能是 metadata、可能是第二个传感器(比如红外)、也可能是厂商自定义的功能节点。所以"插上就能用"这件事在单摄设备上成立,在双摄(彩色+红外)设备上基本不成立。
2.1 用 v4l2-ctl 列出所有 video 节点并逐个确认身份
先装工具:
sudo apt install v4l-utils然后列设备:
v4l2-ctl --list-devices输出会按物理设备分组,每个设备下面挂着若干/dev/videoX。笔记本内置的双摄模组通常会看到一个设备名下面挂 2 到 4 个节点。名字里带Integrated Camera、IR Camera、HD User Facing之类的字样,这些名字来自固件,能帮你初步判断哪个是红外。
接着逐个看能力:
v4l2-ctl -d /dev/video0 --all重点看三块:Video Capture是否被标记、支持的像素格式列表、以及Device Caps。metadata 节点一般只有Metadata Capture,没有Video Capture,一眼就能排除。
再看格式支持:
v4l2-ctl -d /dev/video2 --list-formats-ext红外模组常见的输出格式是GREY(8 位灰度)或者YUYV,分辨率通常固定为 640x480 或 340x340。彩色摄像头常见MJPG、YUYV、H264。如果你看到某个节点只支持GREY,那它八成就是红外通道。
提示:某些模组的红外和彩色是同一个节点轮流输出的,通过 ioctl 切换。这种情况在
--list-formats-ext里会同时看到 GREY 和 YUYV,切换方式因厂商而异,比较少见但确实存在。
2.2 红外模组的灰度格式协商,以及"伪红外"的识别方法
确认了红外节点之后,先用最简单的工具验证它能出图。ffmpeg是个好选择,因为它对格式协商的容错比 OpenCV 好:
ffmpeg -f v4l2 -input_format gray -video_size 640x480 -i /dev/video2 -frames:v 1 -y /tmp/ir.png如果成功,/tmp/ir.png里应该是一张灰度人脸图——前提是你把脸对着摄像头。红外模组通常带主动补光,暗光下也能拍到,画面会有点"鬼影"感,这是正常的。
这里要区分两种"红外":一种是真正的红外摄像头,传感器只对红外波段敏感,输出是纯灰度;另一种是普通彩色摄像头在暗光下自动切了红外截止滤镜(很多网络摄像头有这功能),输出还是彩色,只是偏绿或偏紫。后者对 howdy 没什么额外好处,因为它在暗光下依然噪点巨大。判断方法很简单:真红外在完全黑暗的房间里也能拍出清晰的人脸轮廓,伪红外则是一片黑加噪点。
格式协商失败是后面最常见的坑之一。OpenCV 的VideoCapture在打开设备时会尝试用默认格式协商,如果设备只支持GREY而你让它出 BGR,有些驱动会返回空帧而不报错。howdy 内部是通过配置文件里的frame_width和frame_height控制的,但像素格式它自己不做指定,靠驱动默认。所以如果你发现howdy test出来的画面全黑,先回到这一步,用 v4l2-ctl 把格式显式设成GREY,再试:
v4l2-ctl -d /dev/video2 --set-fmt-video=width=640,height=480,pixelformat=GREY这个设置不持久,重启会丢。持久化的做法是写 udev 规则或者在 howdy 的启动脚本里加一句,后面第 5 章会讲。
2.3 权限与驱动占用:为什么 cv2 打开设备总是返回空帧
摄像头节点默认属于video组,普通用户不在组里就没有读权限。检查一下:
ls -l /dev/video* groups如果当前用户不在video组,加进去:
sudo usermod -aG video $USER加完要重新登录才生效。这一步很多人会漏,表现是 root 跑howdy test正常、普通用户跑就黑屏——因为 PAM 认证时是以当前用户身份跑的。
另一个隐蔽问题是驱动占用。如果桌面环境自带的相机预览、或者某个后台服务(比如会议软件)已经打开了这个节点,第二个进程再去打开会失败或者拿到空帧。UVC 驱动在多数情况下支持多进程共享,但部分厂商的固件实现不老实。排查方法:
sudo lsof /dev/video2 sudo fuser -v /dev/video2如果有进程占着,先关掉它。实在查不出来,可以把摄像头模块重新加载一遍:
sudo modprobe -r uvcvideo sudo modprobe uvcvideo这一步会断开所有摄像头,包括你正在用的会议软件,找个空闲时间做。
3. 源码安装 howdy:依赖、模型与 PAM 的挂载顺序
硬件通了,接下来是软件。howdy 没有进 Debian 官方源,只能从源码装。它的仓库结构不复杂:一个 Python 包、一个 PAM 桥接层(Python 版和 C 版各一份)、还有两个 dlib 模型文件。麻烦的地方在于依赖和 PAM 配置这两块。
3.1 Debian 12 上真正需要装的包(以及几个名字对不上的)
先装编译和运行依赖:
sudo apt install build-essential cmake pkg-config \ python3-dev python3-setuptools python3-pip \ libopencv-dev python3-opencv \ libdlib-dev python3-dlib \ libpam0g-dev libpam-python \ libopenblas-dev这里有几个包名需要特别说明。
python3-dlib在 Debian 12 的源里是存在的,版本足够 howdy 用。用它可以免掉从源码编译 dlib 的漫长过程——dlib 编译一次在中端笔记本上要十几二十分钟,而且峰值内存能到 2GB 以上,小内存机器很容易被 OOM killer 打断,报一个莫名其妙的internal compiler error。我在一台 4GB 内存的旧机器上就吃过这个亏,最后是靠加 swap 才编过去。用源里的包就没这些事。
libpam-python提供pam_python.so,这是 Python 版 PAM 桥接的关键。Debian 12 里这个模块的实际路径是/lib/x86_64-linux-gnu/security/pam_python.so。写 PAM 配置时可以只写模块名pam_python.so,PAM 会自己在标准目录里找;写全路径反而容易因为架构目录名不同而出错。
libpam0g-dev是编译 C 版 PAM 模块用的,如果你想走 C 路线就装,只走 Python 路线可以不装。
3.2 setup.py 安装与 /etc/howdy 目录结构
拉源码、进目录、跑安装脚本:
git clone https://github.com/boltgolt/howdy.git cd howdy sudo python3 setup.py install安装脚本会做几件事:把 Python 包和 PAM 桥接层复制到/lib/security/howdy/,把配置文件放到/etc/howdy/config.ini,把命令行工具howdy放到/usr/local/bin/,然后尝试下载两个 dlib 模型文件到/lib/security/howdy/dlib-data/。模型文件加起来大概 100MB 出头,网络不好的话会卡在这。
如果下载失败,可以手动放。需要的两个文件是:
| 文件名 | 用途 | 大致体积 |
|---|---|---|
shape_predictor_5_face_landmarks.dat | 人脸关键点定位 | 约 9MB |
dlib_face_recognition_resnet_model_v1.dat | 人脸特征编码 | 约 22MB |
手动下载后放进dlib-data目录,改一下属主就行。注意 howdy 不同分支用的关键点模型不一样,有的用 68 点版本,有的用 5 点版本,装之前先看一眼源码里models/目录下引用的文件名,别下错。
安装完验证一下目录结构:
ls /lib/security/howdy/ ls /etc/howdy/正常应该看到pam.py、compare.py、models/、dlib-data/这些。如果/etc/howdy/config.ini不存在,说明安装脚本中途退出了,回头看它的报错。
3.3 PAM 配置的插入位置决定"能用"还是"锁死"
这是全文风险最高的一步。PAM 配置写错,轻则面部识别不生效,重则 sudo 和登录全部失效。所以先讲清楚顺序逻辑。
PAM 的认证流程是按配置文件里的行从上到下依次执行,遇到sufficient且成功的模块就短路返回成功,遇到required且失败的模块就记一笔失败但继续往下走,最后统一判定。面部识别的定位是"能识别就放行,识别不了就退回密码",所以对应的控制位是sufficient,而且必须放在密码模块之前。
以 sudo 为例,Debian 12 的/etc/pam.d/sudo默认长这样:
#%PAM-1.0 @include common-auth @include common-account @include common-session-noninteractive改成:
#%PAM-1.0 auth sufficient pam_python.so /lib/security/howdy/pam.py @include common-auth @include common-account @include common-session-noninteractive放在@include common-auth之前,面部识别成功就直接放行,失败就继续走common-auth里的密码流程。这个顺序不能反,反了的话你会先输密码,密码对了就直接过了,面部识别根本没机会执行。
锁屏的配置在/etc/pam.d/gdm-password或/etc/pam.d/lightdm,取决于你用哪个显示管理器。同理加一行auth sufficient pam_python.so /lib/security/howdy/pam.py到@include common-auth之前。
注意:千万不要往
/etc/pam.d/common-auth里加。那个文件被所有服务引用,包括 SSH、cron、systemd 的各种提权操作。面部识别在这些场景下要么根本跑不起来(没有摄像头访问),要么会拖慢每一次认证。我见过有人加了 common-auth,结果 SSH 登录卡 30 秒超时,最后只能进单用户模式救。
改之前先开一个 root shell 挂着别关:
sudo -i这是保命操作。PAM 配错后sudo会失效,但已经打开的 root shell 不受影响,可以在里面改回来。别嫌麻烦,这一步能省你一次重装。
4. 采集、训练与阈值:让识别在暗光与戴眼镜时都稳定
PAM 配好只是让 howdy "能被执行",识别准不准、快不快,全看采集质量和参数调校。这一章讲实操。
4.1 addface 的采集质量比数量更重要
录入人脸用:
sudo howdy add它会让你输入一个标签(比如default),然后连续采集若干帧。默认大概采集 3 到 5 个样本,每帧之间有短暂间隔,摄像头上会有提示。
这里有几个经验点。
第一,采集时的光照条件要接近日常使用条件。如果你在正午阳光下采集,晚上暗光下识别率会掉得很厉害。比较稳妥的做法是采两次:一次正常室内光,一次只开屏幕背光的暗环境,标签分别起名,howdy 会同时比对两组模板,取最优匹配。
第二,采集角度要覆盖你日常的姿态。坐着用电脑时脸是正对屏幕的,但掀盖解锁时脸往往是俯视角度。如果只在正对时采集,掀盖那一下经常识别不出来。可以故意歪头、俯视、侧脸各采一组。
第三,戴眼镜的话,采集时也戴着。反光会改变人脸特征编码,不戴眼镜采集、戴眼镜使用,误拒率会明显上升。经常切换的话就录两组。
采集完可以用sudo howdy list看当前有哪些标签,用sudo howdy test做实时预览测试。howdy test会打开一个窗口显示摄像头画面和检测框,同时打印当前匹配到的标签和距离值,调阈值时非常有用。
4.2 config.ini 每一项参数的实际作用与推荐值
配置文件在/etc/howdy/config.ini,改完不用重启服务,下一次认证就生效。下面是几个真正影响体验的项。
| 参数 | 作用 | 推荐值 | 说明 |
|---|---|---|---|
device_path | 摄像头节点路径 | /dev/video2 | 用第 2 章确认过的红外节点 |
camera_name | 按名称匹配设备 | 留空或填设备名 | 节点号会变时用它更稳 |
timeout | 单次识别最长等待秒数 | 4 | 太短来不及摆正脸,太长卡登录 |
certainty | 匹配距离阈值 | 3.5起调 | 越小越严格,越大越宽松 |
dark_threshold | 画面平均亮度下限 | 50 | 低于此值跳过检测,防黑屏误判 |
frame_width/frame_height | 采集分辨率 | 640/480 | 跟摄像头原生分辨率一致最好 |
exposure | 曝光补偿 | -1 | 负值表示自动 |
no_confirmation | 识别成功后不再要密码 | false | 保持 false,保留退路 |
suppress_unknown | 不打印未识别日志 | false | 排查时保持 false |
rotate | 画面旋转角度 | 0 | 摄像头装反了才改 |
recording_plugin | 是否录制认证画面 | 0 | 关掉,省磁盘也省隐私顾虑 |
certainty是最需要反复调的一项。它的含义是当前人脸编码与已存模板之间的最小距离,超过这个值就判定为不匹配。dlib 的距离范围大致在 0 到 1 之间,howdy 内部做了放大,所以配置里看到的是 3.x 这种数量级。
调法是这样的:sudo howdy test开着,正常对着摄像头看它打印的距离值。本人正常姿态下应该在 3.0 以下,稍微歪头或者暗光下可能到 3.3 左右。陌生人或者照片大概在 4.0 以上。所以阈值设在 3.5 是个比较稳的平衡点。如果你发现经常要试两三次才成功,说明阈值偏严,往上调到 3.8;如果担心误识,往下调到 3.2,代价是多输几次密码。
dark_threshold这项容易被忽略,但很有用。红外摄像头在补光失效或者被遮挡时会输出全黑画面,howdy 如果在这种画面上跑检测,会浪费整个 timeout 时间才返回失败,登录体验很差。把这个值设到 50 左右,画面亮度不够时直接跳过,立刻退回密码,用户感知上就是"秒过"。
4.3 certainty 阈值的调法:从误拒到误受的连续调节
阈值调整本质上是在两条错误率之间做取舍:误拒(本人认不出)和误受(别人能认出)。howdy 没有提供 ROC 曲线工具,只能靠手工采样估算。
比较靠谱的做法是做一个简易测试集:本人不同光照、不同角度各拍 20 张,另一个人的脸拍 20 张,跑一遍看距离分布。howdy 有个隐藏的调试模式,在config.ini里把suppress_unknown设为false,然后howdy test会打印每一帧的匹配结果和距离。虽然不能批量跑,但手动试十几张也够看出趋势。
实际调下来,多数人在 3.2 到 3.8 之间能找到一个自己满意的点。如果两个分布严重重叠(本人和他人距离差不多),说明采集质量有问题,回去重新采,别指望阈值能救。
提示:调整阈值之后,务必用另一个人(或者自己的照片)试一次能不能骗过去。这个测试不做,你不知道自己的阈值到底松到什么程度。
5. 实战排错链路:四个真实出现过的故障与定位过程
下面这四个故障是我和周围人实际踩过的,按出现频率排序。每个都写出完整的排查路径,方便你复现同样的思路。
5.1 sudo 无限循环或提示后卡住
现象:改了/etc/pam.d/sudo之后,敲sudo弹出摄像头提示,然后卡住十几秒,最后报sudo: PAM authentication error,再敲还是这样。
排查顺序:
第一步,从已经打开的 root shell(或者另一台机器 SSH 进普通用户再su -)里检查pam.py是否存在、路径是否对得上。Debian 12 上 howdy 装完之后pam.py在/lib/security/howdy/pam.py,如果你的安装路径不同,PAM 配置里的路径要跟着改。
第二步,手工跑一次桥接脚本看有没有 Python 异常:
python3 /lib/security/howdy/pam.py正常会输出用法提示或者直接退出。如果报ModuleNotFoundError: No module named 'cv2',说明系统 Python 找不到 OpenCV。Debian 12 的python3-opencv装在/usr/lib/python3/dist-packages/,检查一下python3 -c "import cv2; print(cv2.__file__)"能不能通。不通的话,很可能是你之前用 pip 装过别的 opencv 版本,把路径搞乱了。
第三步,确认/etc/howdy/config.ini里的device_path对普通用户可读。PAM 认证是以当前用户身份跑的,如果/dev/video2的权限是root:root 600,普通用户拿不到画面,表现就是卡到超时。
第四步,看系统日志:
journalctl -xe | grep -i howdy grep -i pam /var/log/auth.logauth.log里会记 PAM 各模块的返回值,能直接看出是哪个模块返回了失败。
修复方式就是把 PAM 里那行注释掉,sudo立刻恢复。改回来之后再逐项排查。
5.2 亮屏正常、暗光下识别率断崖式下跌
现象:白天用得好好的,晚上室内灯一关,识别成功率从九成掉到一成,经常要试三四次。
这个几乎都是红外模组没真正起作用。排查:
先确认device_path指向的确实是红外节点,而不是那个彩色节点。很多时候设备注册顺序会变,上次是/dev/video2是红外,这次video2变成了彩色,红外跑到video4去了。用v4l2-ctl --list-devices重新确认一遍,或者改用camera_name按设备名匹配,稳定性好很多。
然后确认红外补光在工作。真的红外摄像头在暗光下画面上会有明显的中心亮区(补光灯照出来的),如果画面均匀的暗、只有噪点,说明补光没开。有些模组的补光需要驱动显式打开,UVC 标准里有相关控制项,可以用 v4l2-ctl 试试:
v4l2-ctl -d /dev/video2 --list-ctrls看有没有LED或者brightness之类的控制项。有的话设置一下。没有的话,说明这个模组的补光由固件自动控制,硬件层面的事情改不了。
第三个可能:dark_threshold设得太高。红外画面本身就偏暗,如果阈值设到 80,正常红外画面也会被判为太暗而跳过。适当降到 40 到 50 之间。
5.3 休眠唤醒后摄像头节点消失
现象:合盖休眠再打开,登录界面摄像头提示不出来,换密码进去之后ls /dev/video*发现节点重新编号了,原来的/dev/video2变成了/dev/video0。
这是 UVC 驱动在电源管理上的老问题,节点号不保证稳定。解决办法是用 udev 规则给摄像头创建固定名字的符号链接。
先拿到设备的唯一标识:
udevadm info --name=/dev/video2 --attribute-walk | grep -E "idVendor|idProduct|serial"然后写规则文件/etc/udev/rules.d/99-howdy-camera.rules:
SUBSYSTEM=="video4linux", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="howdy-cam"把xxxx和yyyy换成实际值。重载规则:
sudo udevadm control --reload-rules sudo udevadm trigger之后/dev/howdy-cam就固定指向那个设备,config.ini里device_path改成它就行。注意双摄模组的两个节点 idVendor/idProduct 通常一样,要靠ATTRS{bInterfaceNumber}之类进一步区分,具体看--attribute-walk的输出。
5.4 编译 dlib 内存爆掉
如果坚持源码编译 dlib,遇到c++: fatal error: Killed signal terminated program cc1plus,基本就是内存不够被 OOM killer 杀了。
三个办法,按推荐顺序:
第一,直接用源里的python3-dlib,别自己编。这是最省事的。
第二,加 swap。临时加 4GB:
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile编完再关掉。
第三,限制编译并行度:
MAKEFLAGS="-j1" pip install dlib单线程编译慢但内存占用低,4GB 机器能过去。
6. 安全边界:面部识别作为 PAM 认证的合理定位
最后聊一个容易被忽略但很重要的角度:howdy 到底该不该用在所有认证场景。
6.1 照片与视频回放为什么能过,howdy 缺的是什么
前面提过,howdy 没有活体检测。这意味着:
- 一张打印出来的人脸照片,对着摄像头能通过。
- 手机屏幕上的照片,能通过。
- 一段视频回放,大概率能通过。
红外模组在理论上能提高门槛,因为照片和屏幕的红外反射特性跟真皮肤不同。但 howdy 的算法并没有利用这个差异——它拿到红外灰度图之后,走的是跟彩色图一样的 dlib 人脸检测和特征比对流程,没有做反射率分析。所以指望红外来防照片,是想多了。
真正的活体检测需要专门的算法,比如要求用户眨眼、转头、做特定表情,或者用结构光/ToF 传感器测深度。这些 howdy 都不做。
所以在安全定位上,howdy 应该被理解为一个便利性工具,不是安全增强。它能挡住"别人路过随手按一下你的电脑"这种场景,挡不住有备而来的人。
6.2 与密码、密钥的组合策略
基于上面的判断,我的配置策略是这样的:
sudo提权用 howdy,因为它的风险可控——即使被人骗过,也只能执行一条命令,而且有日志。日常登录用 howdy,图个方便。但涉及敏感操作的场景,一律保留密码或密钥作为第二因素。
具体做法上,config.ini里no_confirmation保持false,这样识别成功之后还会要一次密码确认(取决于 PAM 配置,有的配置下 sufficient 会直接短路,那就没有二次确认了)。如果你要严格一点,可以把 howdy 那一行改成auth required然后配合密码模块做双因素,代价是每次都要面部加密码,体验会差一些。
另一个实践是定期清理模板。sudo howdy clear会清掉所有样本,换发型、留胡子、做医美之后重新采集,识别率会明显回升。这个操作很多人忘了做,然后抱怨"怎么越来越不准"。
还有一点:howdy 会记录认证日志到auth.log,包括成功和失败。如果你在意隐私,可以定期清理,但更建议保留——出问题时这是唯一的排查依据。
我个人在这台机器上的最终状态是:红外模组固定在/dev/howdy-cam,certainty调到 3.4,timeout4 秒,dark_threshold45,只挂载在 sudo 和锁屏两处,登录界面还是老老实实敲密码。用下来日常提权基本不用碰键盘,误识率在可接受范围内。至于安全性,我心里清楚它挡不住什么,所以重要操作从来不让它单独把关。