はじめに
Bash on Ubuntu on Windows (WSL)のSSHで,ssh-agentのかわりにWindows10側のpageantを利用する方法のメモです。
PuTTYとWSLのsshやgitなどを併用する際に便利かと思います。
ほぼwsl-ssh-pageantのREADME.mdに記載されている通りの内容ですが,原典ではsocatの使い方がダサいので少しマシな方法を書いておきます。
2017/11/2追記:
Creators Update以降ならweasel-pageantを使う方が手順が少なくスマートかもしれません。
必要なもの
Windows側
- Pageantまたはその互換品
- wsl-ssh-pageant
Ubuntu側
- socat
-
cbwin (無くても可)(Creators Update適用後は不要)
インストール
Windows側
- Pageantまたはその互換品をダウンロードし,適当なフォルダに展開
- https://github.com/benpye/wsl-ssh-pageant/releases よりwsl-ssh-pageantをダウンロードし,適当なフォルダに展開
Ubuntu側
-
sudo apt-get install socat
でsocatをインストール -
Ubuntu側からwsl-ssh-pageantを起動したいなら,このへんを参考にcbwinをインストール(2017/07/05追記: CreatorsUpdate適用後ならUbuntu側からWindowsプログラムを直接実行可能)
実行
-
Windows側でPageantを起動しておく
-
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 [ポート番号] &
-
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
。 -
環境変数
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
でソケットの残骸を削除して再実行。lsof
やnetstat -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へのアクセスに対し,認証なしに無条件で応答してしまうという問題を持つ。
マルチユーザ環境や信頼できないプログラムが走る可能性のある環境では絶対使用しちゃいけない。