win-ssh-wrap

win-ssh-agent よりも先に起動されたプロセスから Cygwin の ssh を使用したい場合などに、 SSH_* 環境変数が受け取れない問題を解消するための、 ラッパープログラムである win-ssh-wrap について説明します。

本ソフトウェアの利用ライセンスは、 商業利用も容易な、 所謂 "MIT/X スタイル" ライセンスを採用しています。

動機

TortoiseCVSTortoiseSVN と同様の UI を、 Mercurial リポジトリで使用可能にする TortoiseHG がリリースされましたが、 試用してみたところ、 Explorer からの操作の際には ssh によるリポジトリ連携での Cygwin ssh 利用が (パスフレーズ付きの秘密鍵を使用している場合は) できません。

一般に、ssh でパスフレーズ付きの秘密鍵を使用する場合、 パスフレーズの入力は:

のいずれかで行われます (詳細は ssh に関する解説サイトを参照してください)。

「コマンドラインから入力」は、 TortoiseHG が Explorer 経由で実行される場合には意味を持ちません。

「SSH_ASKPASS 環境変数〜」は、 ssh のマニュアル表記上は可能なことになっていますが、 実のところCygwin 環境では機能しません (仮にこの問題が解消しても、 次に述べる理由のために機能しないのですが…)。

「SSH_AUTH_SOCK 環境変数〜」に関してですが、 仮に win-ssh-agent を「スタートアップ」から起動したとしても、 SSH_AUTH_SOCK 環境変数が設定される前に (プロセスとしての)Explorer は起動されているらしく、 Explorer から起動される TortoiseHG は win-ssh-agent が設定する環境変数値を受け取ることができないため、 これも機能しません。

以上の理由により、 通常は TortoiseHG に同梱される PuTTY の ssh クライアント・パスフレーズ管理ユーティリティを利用するようですが:

といったことを (1) 二重に行う覚悟をした上で Cygwin ssh と PuTTY の ssh クライアントを併用するか、 (2) Cygwin ssh の利用を諦めて PuTTY の ssh クライアントを常用するか、あるいは (3) TortoiseHG の利用そのものを諦めるかの選択が必要になります。

しかし個人的には、 (4) Cygwin ssh で TortoiseHG を利用できるようにする、 という選択をしたいところです。

原理

win-ssh-agent は、 環境変数用の Windows レジストリエントリを追加することで、 直接の親子関係に無いプロセスからも SSH_AUTH_SOCK といった環境変数を参照可能にしています。

裏を返せば、 該当する Windows レジストリエントリを読み込むことができれば、 親プロセスの環境変数設定状況に関わらず、 ssh-agent 連携が可能になります。

Cygwin ssh に Windows レジストリから直接環境変数を読み込ませることはできませんが:

というように、 環境変数設定を整えたうえで Cygwin ssh を起動する中間プログラムを用意すれば、 期待する機能は十分果たしてくれます。

効能

win-ssh-agent が立ち上がってさえいれば、 起動のタイミングに関わらずに最新の SSH_AUTH_SOCK 環境変数を受け取れますので:

といった、従来では問題のあった状況でも、 Cygwin ssh と win-ssh-agent との連携が可能になります。

インストール&利用方法

  1. アーカイブをダウンロード
  2. gunzp + tar で展開
  3. 展開されたディレクトリに移動
  4. make all」でコンパイル
  5. 生成された *.exe ファイルを任意の場所(/usr/local/bin~/bin)にコピー

上記手順により、以下の *.exe ファイルが生成されます。

以後の ssh コマンド利用の際には、 これら w- 付きのコマンドを起動してください。

詳細に関しては、アーカイブに同梱される README.ja.txt ファイルを参照してください。