WSL 里用 SSH 的时候,希望直接用 1Password 里存的密钥,而不是再单独管一份。1Password 已经在 Windows 下提供了一个自定义的 SSH Agent,但它无法直接在 WSL 下使用。变通方法是用 npiperelay 把 Windows 的管道转成 Unix socket,WSL 这边用 socat 转发到本地,然后让 SSH 使用这个 socket。
安装依赖
Windows 端安装 npiperelay:
winget install albertony.npiperelay
WSL 端安装 socat(这里我是用Arch Linux):
paru -S socat
将 npiperelay 链接到 WSL
把 Windows 侧的 npiperelay.exe 软链到 WSL 的 PATH 中:
ln -s /mnt/c/Users/<username>/<path_of_npiperelay> ~/.local/bin/npiperelay
请将
<username>和<path_of_npiperelay>替换为实际路径。
配置 systemd 服务
创建用户级 systemd 服务,开机自动建立 socket 转发:
# ~/.config/systemd/user/ssh-agent-1password.service
[Unit]
Description=Expose Windows 1Password SSH agent to WSL via npiperelay+socat
After=default.target
[Service]
Environment=SSH_AUTH_SOCK=%t/ssh-agent-1p.sock
ExecStartPre=/usr/bin/rm -f %t/ssh-agent-1p.sock
ExecStart=/usr/bin/socat \
UNIX-LISTEN:%t/ssh-agent-1p.sock,mode=0600,unlink-early,fork \
EXEC:'%h/.local/bin/npiperelay -ei -s //./pipe/openssh-ssh-agent',nofork
Restart=on-failure
[Install]
WantedBy=default.target
设置环境变量
让所有 shell 会话自动使用这个 socket:
# ~/.config/environment.d/10-ssh-agent.conf
SSH_AUTH_SOCK=%t/ssh-agent-1p.sock
启用并验证
systemctl --user daemon-reload
systemctl --user enable --now ssh-agent-1password.service
验证密钥是否可见:
ssh-add -l
如果输出了 1Password 中的公钥指纹,说明一切就绪。