ブログ

読んで思い出す。忘れるために書く

WSL2 + 1Password で SSH 接続・通信をする (npiperelay, socat)

目的・ゴール

1Password が SSH キーを管理できる ので、それを WSL 上でも可能にする

今回の対象は GitHub で、通信テストをして成功すれば OK

環境・前提

おおまかな手順

  1. npiperelay.exe をインストール (Windows)
  2. socat をインストール (Ubuntu)
  3. ~/.bashrc に設定記述
  4. WSL のシャットダウン・再び起動
  5. 動作テスト

npiperelay.exe のインストール

Windows 上で操作。go コマンドを使うとラク

go install github.com/jstarks/npiperelay@latest

# → C:\Users\__my_user_name__\go\bin\npiperelay.exe

socat のインストール

今度は WSL 上で操作

sudo apt install socat

~/.bashrc の設定記述

引き続き、WSL 上。

NPIPE_RELAY_EXEC_PATH には、Windows 側でインストールした PATH を、Ubuntu 側から参照できる形の PATH として記述する

# Configure ssh forwarding
export SSH_AUTH_SOCK=$HOME/.ssh/agent.sock
# need `ps -ww` to get non-truncated command for matching
# use square brackets to generate a regex match for the process we want but that doesn't match the grep command running it!

NPIPE_RELAY_EXEC_PATH="/mnt/c/Users/__my_user_name__/go/bin/npiperelay.exe"

ALREADY_RUNNING=$(ps -auxww | grep -q "[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent"; echo $?)

if [[ $ALREADY_RUNNING != "0" ]]; then
    if [[ -S $SSH_AUTH_SOCK ]]; then
        echo "removing previous socket..."
        rm $SSH_AUTH_SOCK
    fi
    echo "Starting SSH-Agent relay..."
    (setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"$NPIPE_RELAY_EXEC_PATH -ei -s //./pipe/openssh-ssh-agent",nofork &) >/dev/null 2>&1
fi

WSL のシャットダウン・再び起動

Windows 上で操作。

設定を終えたら、Windows 側で 一度 WSL をシャットダウンする

wsl --shutdown

もういちど WSL (Ubuntu) を起動してみると、~/.bashrc に記述したとおり、echo で文字列が出力されるようになるはず

動作テスト

ssh のテスト接続で、Windows, Ubuntu どちらも 1Password が介入してくるはず

Windows

ssh -T git@github.com

WSL (Ubuntu)

ssh -T git@github.com

Links