转发 1Password SSH Agent Socket 到 WSL

Dec 5, 2025 · 3min

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 中的公钥指纹,说明一切就绪。

> comment on mastodon / twitter
>