
指南说明
1.1 适用场景
本指南适用于在 WSL 环境下的 Arch Linux 系统,手动完成 WSL-Hello-sudo 的部署,实现通过 Windows Hello(人脸/指纹/PIN)验证替代 sudo 密码输入的功能。
1.2 核心适配点(与 Ubuntu/Debian 差异)
- PAM 模块目录固定为
/lib/security(Ubuntu/Debian 为/lib/x86_64-linux-gnu/security); - 无
pam-auth-update工具,需手动编辑 PAM 配置文件; - 依赖包通过
pacman安装,而非apt; - 默认可能未启用 WSL Interop 功能,需手动配置以执行 Windows 可执行文件(.exe)。
1.3 前置环境要求
- WSL 版本:推荐 WSL 2(WSL 1 对 Interop 支持较差,易出现执行 .exe 报错);
- Windows 环境:已启用 Windows Hello(设置 > 账户 > 登录选项 中配置人脸/指纹/PIN);
- Arch 权限:拥有普通用户 sudo 权限(禁止直接使用 root 用户操作)。
前置准备
2.1 确认 WSL 版本
在 Windows 终端(CMD/PowerShell)中执行以下命令,确认 Arch 对应的 WSL 版本为 2:
wsl -l -v
若版本为 1,执行以下命令转换(需替换Arch 为你的 Arch 分发版名称):
wsl --set-version Arch 2
wsl --set-default-version 2
2.2 安装依赖包
在 Arch WSL 终端中执行,安装编译/运行所需依赖(仅使用预编译包可跳过 Rust 相关):
# 更新系统包索引
sudo pacman -Syu
# 安装核心依赖
sudo pacman -S --needed openssl libpam base-devel wslu
# (可选)若需手动编译组件,安装 rust 环境
sudo pacman -S --needed rustup
rustup default stable
# 安装 Windows 交叉编译目标(仅编译 Windows 组件时需)
rustup target add x86_64-pc-windows-msvc
2.3 下载预编译包
# 下载最新 release 包
wget https://github.com/nullpo-head/WSL-Hello-sudo/releases/latest/download/release.tar.gz
# 解压并进入工作目录
tar xvf release.tar.gz && cd release
# 验证文件完整性(需包含以下关键文件)
ls -l build/ # 应显示 pam_wsl_hello.so(Linux PAM 模块)和 WindowsHelloBridge.exe(Windows 核心组件)
详细步骤
1:修复 WSL Interop 功能(核心,解决 .exe 执行报错)
Arch WSL 默认可能未启用 Interop(WSL 与 Windows 程序互调功能),执行以下命令启用并验证:
# 挂载 binfmt_misc 内核模块(Interop 依赖)
sudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
# 注册 Windows 可执行文件格式(让 WSL 识别 .exe 并转发执行)
echo ':DOSWin:M::MZ::/init:' | sudo tee /proc/sys/fs/binfmt_misc/register
# 验证 Interop 是否生效(执行 Windows 的 cmd.exe)
/mnt/c/Windows/System32/cmd.exe /C echo "Interop OK"
若输出 Interop OK 则说明生效;若仍报错,执行 wsl --shutdown 重启 WSL 后重新尝试。
2:配置安装路径并复制 Windows 组件
定义 Windows 端组件的安装路径,复制 WindowsHelloBridge.exe 到指定目录:
# 1. 自动获取 Windows 用户名(避免手动输入错误)
WINUSER=$(/mnt/c/Windows/System32/cmd.exe /C "echo %username%" | tr -d '\r\n')
# 2. 定义核心路径(与官方 install.sh 默认路径一致)
MNT="/mnt/c" # Windows C 盘在 WSL 中的挂载点(默认即为 /mnt/c)
PAM_WSL_HELLO_WINPATH="${MNT}/Users/${WINUSER}/AppData/Local/Programs/wsl-hello-sudo"
# 3. 创建目录并复制 Windows 核心组件
mkdir -p "${PAM_WSL_HELLO_WINPATH}" # 路径不存在则创建
cp build/WindowsHelloBridge.exe "${PAM_WSL_HELLO_WINPATH}/"
# 4. 赋予可执行权限(WSL 中调用 Windows 程序需显式授权)
chmod +x "${PAM_WSL_HELLO_WINPATH}/WindowsHelloBridge.exe"
3:安装 Linux PAM 模块
将编译好的 PAM 模块复制到 Arch 系统的 PAM 模块目录,并配置正确权限:
# Arch 固定 PAM 模块目录:/lib/security
SECURITY_PATH="/lib/security"
# 备份原有模块(若存在,避免覆盖后无法恢复)
sudo mv "${SECURITY_PATH}/pam_wsl_hello.so" "${SECURITY_PATH}/pam_wsl_hello.so.bak" 2>/dev/null
# 复制新的 PAM 模块到系统目录
sudo cp build/pam_wsl_hello.so "${SECURITY_PATH}/"
# 配置权限(必须为 root 所有,权限 644,否则 PAM 无法加载)
sudo chown root:root "${SECURITY_PATH}/pam_wsl_hello.so"
sudo chmod 644 "${SECURITY_PATH}/pam_wsl_hello.so"
4:创建 WSL-Hello-sudo 核心配置文件
生成系统配置文件,记录 Windows 组件路径和 C 盘挂载点,供 PAM 模块调用:
# 1. 创建配置目录
sudo mkdir -p /etc/pam_wsl_hello/
# 2. 写入配置内容(自动填充路径,无需手动修改)
sudo tee /etc/pam_wsl_hello/config > /dev/null << EOF
authenticator_path = "${PAM_WSL_HELLO_WINPATH}/WindowsHelloBridge.exe"
win_mnt = "${MNT}"
EOF
5:生成 Windows Hello 凭证密钥(关键步骤)
通过 Windows 组件生成密钥对,用于 WSL 与 Windows Hello 的身份验证:
# 1. 进入 Windows 组件所在目录
cd "${PAM_WSL_HELLO_WINPATH}"
# 2. 生成凭证(${USER} 为当前 Arch 用户名,自动匹配)
./WindowsHelloBridge.exe creator "pam_wsl_hello_${USER}"
执行后会弹出 Windows Hello 认证窗口,选择已配置的人脸/指纹/PIN 完成验证。验证成功后,目录下会生成 pam_wsl_hello_${USER}.pem 公钥文件。
提示:若弹出窗口在后台,可先打开一个 Windows 窗口(如记事本),再重新执行上述命令。
6:同步公钥到 Arch 系统配置目录
将生成的公钥复制到 PAM 模块的密钥目录,供验证时读取:
# 创建公钥存储目录
sudo mkdir -p /etc/pam_wsl_hello/public_keys/
# 复制公钥(自动匹配当前用户)
sudo cp "pam_wsl_hello_${USER}.pem" /etc/pam_wsl_hello/public_keys/
7:手动配置 PAM(Arch 核心差异点)
Arch 无 pam-auth-update 工具,需直接编辑 sudo 的 PAM 配置文件,启用 WSL-Hello-sudo 验证:
# 1. 备份原有配置(关键!避免配置错误导致无法使用 sudo)
sudo cp /etc/pam.d/sudo /etc/pam.d/sudo.bak
# 2. 编辑 sudo PAM 配置文件
sudo nano /etc/pam.d/sudo
在文件 最顶部 新增以下内容(保留原有所有配置,仅添加此行):
auth sufficient pam_wsl_hello.so
配置说明:
sufficient:表示 Windows Hello 认证成功则直接通过,无需输入密码;认证失败则自动回退到密码验证,避免因配置错误锁死 sudo 权限。
编辑完成后,按 Ctrl+O 保存,Ctrl+X 退出 nano。
8:验证部署结果
执行以下命令测试是否生效:
sudo ls
若弹出 Windows Hello 认证窗口,验证通过后无需输入密码即可执行 ls 命令,说明部署成功。
常见问题排查
问题 1:执行 .exe 文件提示「Exec format error」
原因:WSL Interop 功能未启用或失效。
解决方案:重新执行步骤 1 的 Interop 配置命令,若仍无效,执行 wsl --shutdown 重启 WSL 后重试;确认 WSL 版本为 2(WSL 1 兼容性较差)。
问题 2:执行 sudo 仍要求输入密码,未弹出 Windows Hello 窗口
排查方向:
- 检查 PAM 配置:执行
cat /etc/pam.d/sudo,确认auth sufficient pam_wsl_hello.so已添加在文件最顶部; - 检查公钥路径:确认
/etc/pam_wsl_hello/public_keys/下存在pam_wsl_hello_${USER}.pem文件; - 检查 PAM 模块权限:执行
ls -l /lib/security/pam_wsl_hello.so,确认权限为-rw-r--r--且所有者为 root:root。
问题 3:Windows Hello 窗口弹出后验证失败
原因:Windows Hello 凭证未正确生成或公钥同步失败。
解决方案:重新执行步骤 5(生成凭证)和步骤 6(同步公钥),确保验证过程中无报错;检查 Windows 端 Windows Hello 是否正常可用(可通过 Windows 登录验证)。
问题 4:PAM 配置错误导致 sudo 无法使用
解决方案:通过备份文件恢复配置:
sudo cp /etc/pam.d/sudo.bak /etc/pam.d/sudo
注意事项
- 全程禁止使用 root 用户直接操作,否则会导致文件权限异常,PAM 模块无法加载;
- 修改 PAM 配置前必须备份
/etc/pam.d/sudo,避免配置错误导致 sudo 失效; - 若 WSL 重启后 Interop 失效,可将步骤 1 的两条命令添加到
/etc/profile中,实现开机自动启用; - 仅支持 sudo 验证替换,其他依赖 PAM 的服务(如 su)需额外编辑对应 PAM 配置文件(如
/etc/pam.d/su)。