WSL2からWindowsのOpenSSH Authentication Agentに接続する
前回、OpenSSH Authentication Agentに秘密キーを登録して、SSH接続時のパスフレーズ入力を省略できるようにしました。加えて今回は、WSL2側からも利用できるようにしていきます。
技術的な説明は参考リンク先に詳しいので、この記事では簡単に利用手順をメモしていきます。
Windows側の設定
OpenSSH Authentication Agent 有効化
前回と同じですので省略します。
npiperelayのセットアップ
ダウンロード
rupor-github/wsl-ssh-agentから最新版のwsl-ssh-agent.zipをダウンロードします。この記事公開時点ではv1.5.2でした。
展開
ダウンロードしたwsl-ssh-agent.zipを適当な場所に展開します。zipの中にはいくつかのファイルが入っていますが、実際に使用するのはnpiperelay.exeとなります。
今回はC:\Users\<name>\binにnpiperelay.exeを移動させました。
WSL2(Ubuntu)側の設定
作業に入る前に、Microsoft StoreでUbuntuの更新通知があったので更新しておきました。更新後、WSL2の起動とターミナルの起動をします。
パッケージ更新
先にパッケージ類の更新をしておきます。
$ sudo apt update && sudo apt upgrade -y
socatをインストール
$ sudo apt install -y socat
~/.bashrcの編集
npiperelayのパスはWin側での保存場所を指定しますが、WSL2からWinへのアクセスとなりますので/mnt/c/path/to(マウント)となります。
export SSH_AUTH_SOCK=$HOME/.ssh/agent.sock
ss -a | grep -q $SSH_AUTH_SOCK
if [ $? -ne 0 ]; then
rm -f $SSH_AUTH_SOCK
( setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"/mnt/c/Users/<name>/bin/npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork & ) >/dev/null 2>&1
fi
.bashrcの変更を反映させる
.bashrcの編集が終わったので反映させます。WSL2の再起動かターミナル再起動か、以下のコマンドからいずれか1つを実行します。
# シェルの再起動
$ exec $SHELL -l
# 現在のシェルに反映
$ source ~/.bashrc
$ . ~/.bashrc
以上で準備が完了しました。
WSL2からWinのssh-agentに接続する
これまでの設定で、WSL2でもWin側と同じようにssh-agentにアクセスできるようになったはずなので試してみます。
$ ssh-add -l
The agent has no identities.
前回記事で登録した鍵の表示を期待したのですが、そうはなりませんでした……。
原因は.sshの所有者とパーミッション
$ ssh-add -l
を実行しても、.bashrcで指定した$HOME/.ssh/agent.sockが出力されていなかったのでls -la
で確認したところ、~/.sshの所有者/グループがrootになっていました。
所有者とパーミッションの変更
$ pwd
/home/<name>
$ sudo chown -R <name>:<group> .ssh
chmod 700 .ssh
再度接続
$ ssh-add -l
256 SHA256:+XXXXXXXXXX.... id_ed25519_server (ED25519)
無事にWSL2からWinに接続できたようです。
エラーが出る場合
稀に以下のエラーが発生することがありますが、Windowsの再起動で解消しました。
error fetching identities: communication with agent failed