Posted at

Git for WindowsのシェルからPageantでSSH

More than 3 years have passed since last update.

Windows上からGitを使う場合に「Git for Windows」という環境がありますが、このコマンドライン環境からWindowsのPageantにある鍵を使ってSSHを行うことができます。


Windows上のUnixコンソール

Windows上で動くUnix環境を構築したい場合、メジャーなものとしては2つの選択肢があります(なお、Unix環境を構築したいだけなら「VMを立ち上げる」という選択肢もありますが、Windows上で直接動くわけではありませんのでここでは除外します)。両者は方向性が大きく違っています。


Cygwin

Cygwinは、「Windows上でPOSIXを再現する」ことを主眼に置いて開発されています。そのため、Unix向けのソースコードをそのままで実行できることも多いですが、それを実現するためのライブラリは大きなものとなっています。


MinGW/MSYS

MSYSが「Minimal SYStem」の略だということからも伝わるように、プログラム開発に当たって最低限のツールだけを移植していて、あとはWindowsのコードをそのまま使うようになっています。

Git for Windowsもコンパイラなどは付いていませんが、MSYSをベースとしたUnixライクなコンソール環境を用意しています。


Pageantとは

以前の記事でも触れましたが、SSHの秘密鍵を管理するためのツールがあって、「鍵エージェント」と呼ばれています。Windowsでよく使われる鍵エージェントとしてPageantがあって、発祥元のPuTTYはもとより、TeraTermやSourceTree、WinSCPなど、SSH/SCP/SFTPといったプロトコルを扱うWindows用ソフトウェアの多くで扱えます。

CygwinでバリバリのUnix環境を構築するというのであれば、Cygwin内に鍵エージェントを持てばいいのでしょうけど、Windowsでもそこそこ鍵を使う、あるいはWindowsで使うのがメインで、Git for Windowsを使う程度、となればそのためだけに両方で鍵のセットアップをするというのも面倒だし管理もしきれなくなってきます1

そこで登場するのが、Pageantの鍵をCygwin/MSYS環境に中継するエージェント、cuviper/ssh-pageantです。


実行ファイルのインストール


ふつうのCygwin/MSYSの場合

どちらでも、インストーラから入れられるパッケージの中に、最初からssh-pageantが用意してあります。Cygwinならsetup.exeなり適当なラッパーから、MSYSならpacman経由でインストールできます。


Git for Windowsの場合

Git for WindowsはあくまでGitを動かすため「だけの」環境なので、追加パッケージをインストールできるようにはなっていません。しかも、どういうわけかバイナリリリースとしてもCygwinの32/64ビット、MSYSの32ビットはあるのに、なぜかMSYSの64ビット版が見当たりませんでした。仕方がないので、MSYS2をインストールしてpacmanssh-pageantを入れて、そこからssh-pageant.exeだけ取り出すという、実に富豪的な手段を取りました(パッケージマネージャーで落としてこれる以上、ssh-pageantだけをどこかでダウンロードできるとは思うのですが)。


シェルへのインストール

Unix系にネイティブなssh-agentであれば、シェルの操作状況に応じてオンオフすることもあるとは思います。それに対して、ssh-pageantはあくまでPageantへの中継役に過ぎず、これに直接鍵設定をすることもありません。基本的には.bash_profileに書いて起動させっぱなしでいいでしょう(1つ常駐していればいいので、.bash_profileのほうが適当です)。設定は、GitHubに書いてあるように、


~/.bash_profile

eval $(/usr/bin/ssh-pageant -r -a "/tmp/.ssh-pageant-$USERNAME")


こうするだけです。あとはBashを立ち上げ直せば、「ssh-pageant pid ****」のように出て、セットアップ完了です。あとはGitやSSHでPageantの鍵を使えます。





  1. 個人的な事情ですが、スマートカード対応のPageantを使っているので、GitのMSYS環境で同等なものを構築するのはかなり面倒、ということもありました。