SSH
pageant
WSL

Bash on Ubuntu on Windows (WSL) からpageantを利用する

More than 1 year has passed since last update.


はじめに

Bash on Ubuntu on Windows (WSL)のSSHで,ssh-agentのかわりにWindows10側のpageantを利用する方法のメモです。

PuTTYとWSLのsshやgitなどを併用する際に便利かと思います。

ほぼwsl-ssh-pageantREADME.mdに記載されている通りの内容ですが,原典ではsocatの使い方がダサいので少しマシな方法を書いておきます。

2017/11/2追記:

Creators Update以降ならweasel-pageantを使う方が手順が少なくスマートかもしれません。


必要なもの


Windows側


Ubuntu側


  • socat


  • cbwin (無くても可) (Creators Update適用後は不要)


インストール


Windows側


  1. Pageantまたはその互換品をダウンロードし,適当なフォルダに展開


  2. https://github.com/benpye/wsl-ssh-pageant/releases よりwsl-ssh-pageantをダウンロードし,適当なフォルダに展開


Ubuntu側



  1. sudo apt-get install socatでsocatをインストール


  2. Ubuntu側からwsl-ssh-pageantを起動したいなら,このへんを参考にcbwinをインストール (2017/07/05追記: CreatorsUpdate適用後ならUbuntu側からWindowsプログラムを直接実行可能)


実行


  1. Windows側でPageantを起動しておく


  2. cbwinを使わないならWindows側で,cbwinを使うならWindowsまたはBash on Windowsのコンソールからwsl-ssh-pageant.exeを起動する*)

    $ wrun /mnt/c/somewhere/wsl-ssh-pageant.exe [ポート番号]

    $ /mnt/c/somewhere/wsl-ssh-pageant.exe [ポート番号] &




  3. Bash on WindowsのsocatコマンドでUnixドメインソケットとwsl-ssh-pageantのTCPソケットを結合する *), **)

    $ socat UNIX-LISTEN:/tmp/wsl-ssh-pageant.socket,fork,reuseaddr TCP:127.0.0.1:(13000|ポート番号) &

    ,fork,reuseaddrをつけたら永久ループは不要。詳しくはman socat




  4. 環境変数SSH_AUTH_SOCK/tmp/wsl-ssh-pageant.socketをセットする

    $ export SSH_AUTH_SOCK=/tmp/wsl-ssh-pageant.socket



*) デフォルトのポート番号は13000

**) Address already in useのメッセージが出る場合は,pidof socatなどでsocatが起動済みでないことを確認し,rm /tmp/wsl-ssh-pageant.socketでソケットの残骸を削除して再実行。lsofnetstat -xは本稿執筆時点(Ver.1607 build 14393.576)では機能しない。


Tips


  • Windows側でwsl-ssh-pageant.exeを起動するとコマンドプロンプトが残って邪魔くさい。cygwinのrun経由で起動することでコマンドプロンプトの表示は抑止できるが,Ubuntu側からcbwinのwrunコマンドを使う方がスマート。



    • runまたはwrunから起動したwsl-ssh-pageant.exeを終了するには,タスクマネージャから「プロセス」タブで"dotnet"または「詳細」タブで"wsl-ssh-pageant.exe"を選択して「タスクの終了」。



  • socat (1.7.2.3)は作成したUnixドメインソケットの後始末をしてくれない。パッチを書くのがベストだが,以下のようなシェルスクリプトでごまかすことも可能。

#!/bin/bash

#
SOCK=/tmp/wsl-ssh-pageant.socket
PORT=13000

if [ -e $SOCK ]; then
if [ -n "$(pidof socat)" ]; then
echo "Already started" >&2
exit -1
else
rm -f -- "$SOCK"
fi
fi

trap "rm -f -- '$SOCK'" EXIT
/usr/bin/socat UNIX-LISTEN:$SOCK,fork,reuseaddr TCP:127.0.0.1:$PORT
rm -f -- "$SOCK"
trap - EXIT
exit


セキュリティ上の留意点

ssh-agentおよびpageantが持つ一般的な問題に加え,wsl-ssh-pageantはlocalhost:13000へのアクセスに対し,認証なしに無条件で応答してしまうという問題を持つ。

マルチユーザ環境や信頼できないプログラムが走る可能性のある環境では絶対使用しちゃいけない。