win-ssh-askpass: Windows における ssh-agent 利用の簡便化
Tagged:  •  

セキュアなサーバアクセスを行う上で SSH アクセスは非常に便利ですが、 パスフレーズ入力が面倒という側面があります。

この問題は ssh-agent の併用により軽減されますが、 ssh-agent 連携が環境変数ベースで実現されていることから、 複数の Cygwin コンソール(の bash)間で ssh-agent プロセスを共有するには、 (1)ssh-agent 共有のための環境変数設定をファイルに書き出し、 (2)~/.bashrc で読み込む、 といった対処が必要となります。

しかも、bash を経由せずに直接 ssh プロセスを起動するような場合、 書き出された環境変数設定を読み込む契機がありません。 また、tty を持たない状況下でそのような実行が行われた場合、 Cygwin における tty 誤認によりパスフレーズ入力待ちでブロックされてしまい、 ssh から実行が戻ってこないという事態になります。例えば:

  • tty から切り離されたバックグラウンドプロセスにおける ssh 起動
  • ssh 経由の ext リポジトリに対する Emacs PCL-CVS 利用

などが該当します。

win-ssh-askpass を利用することで、 Windows における ssh/ssh-agent 連携を簡便化し、 このような状況を解消することが出来ます。

導入

インストールは、 gcc や make、tar 等の開発系 Cygwin コマンドがインストールされていることを確認した上で、 ダウンロードしたアーカイブファイルを展開し、 展開されたディレクトリ直下で make instal を実行してください。 Cygwin で言うところの /usr/local/bin 配下へのインストールが完了します。

インストールが済んだら、 win-ssh-agent.exe を起動してください。 ssh が暗黙で参照する鍵ファイル(例えば: ~/.ssh/id_rsa~/.ssh/id_dsa~/.ssh/identity など) を使用している場合は特に引数は必要有りません (= Explorer からのダブルクリックでも起動できます)。 標準のパスに無い鍵ファイル、複数の鍵ファイルを扱う場合は、 README ファイル中のオプションの説明を参照してください。

表示されたパスフレーズ問い合わせのウィンドウに対して、 適宜パスフレーズを入力すれば準備は完了です。 新たに起動した Cygwin コンソールで ssh コマンドを実行し、 パスフレーズ入力が不要であることを確認してください。

後は「スタートアップ」への起動用ショートカット登録でもしておけば、 ログイン時のパスフレーズ入力で、 以後全ての ssh コマンド実行がパスフレーズ入力不要となります。

win-ssh-agent 起動後に明示的にパスフレーズを指定する場合、 (1) ssh-add コマンドを利用するか、 (2) タスクトレイの win-ssh-agent アイコンを右クリックし、 パスフレーズを入力する鍵ファイルをメニューから選択してください。

「スタートアップ」にショートカットを登録しておけば、 ログイン時のパスフレーズ入力のみで、 以後の全ての ssh アクセスがパスフレーズ無用で実行できて便利です。

トラブルシューティング

思ったように動かない場合、 以下のようなケースが考えられます。

win-ssh-agent が終了してしまっている:
このケースの原因の多くは、 Cygwin の /bin 相当へのパスが通っておらず ssh-agent コマンドが実行できないことです。 特に Explorer からのダブルクリックで起動した場合は、 Windows の Path 環境変数(Cygwin の、ではありません)が Cygwin の /bin 相当へのパスを含んでいることを確認してください。
鍵ファイル指定が間違っている:
デフォルトで参照される鍵ファイルが無いにも関わらず、 win-ssh-agent を引数無しで起動した場合、 パスフレーズ問い合わせは行われません。 なお、存在しないファイルを指定して起動した場合、 win-ssh-agent は即終了します。
win-ssh-agent よりも前に起動した Cygwin コンソールを使用:
win-ssh-agent よりも前に起動したプロセスには、 環境変数設定が反映されません。 "env | grep SSH_" が何も出力しない場合は、 このケースだと思って良いでしょう。 特にインストール直後の win-ssh-agent 実行時には気を付けてください。
秘密鍵を使用しない ssh 実行:
当該 ssh コマンド実行が 「秘密鍵」ではなく「パスワード認証」を要求するものである場合、 win-ssh-askpass は全く役に立ちません。
パスフレーズが未入力:
問い合わせウィンドウに対して ESC キーを押下した場合は、 問い合わせ自体がスキップされます。 また、-i オプションで指定された鍵のパスフレーズ問い合わせは、 win-ssh-agent 起動時には行われません(末尾の注意参照)。
コンソールを無くすパッチ

patch コマンドを使って以下のパッチを適用することで、 win-ssh-agent 起動の際に表示されるコンソールウィンドウを無くすことが出来ます。

--- a/Makefile	Thu Jul 06 14:41:38 2006 +0900
+++ b/Makefile	Wed Jul 19 10:43:20 2006 +0900
@@ -8,7 +8,7 @@ PREFIX	?= /usr/local/bin
 	$(RC) -i $< -O coff -o $@
 
 win-ssh-agent:	agent.o agent.res misc.o
-	$(LINK.cpp) -e _mainCRTStartup -o $@ $^
+	$(LINK.cpp) -mwindows -e _mainCRTStartup -o $@ $^
 
 win-ssh-askpass:	askpass.o askpass.res misc.o
 	$(LINK.cpp) -mwindows -e _mainCRTStartup -o $@ $^
コンソールウィンドウを無くすためのパッチ
**** 注意 ****

win-ssh-askpass は、 ssh-agent 設定共有のための環境変数設定の問題は解決しますが、 SSH_ASKPASS 機能不全の問題は解決しません。

そのため:

  • win-ssh-agent 起動時にパスフレーズ入力をスキップした秘密鍵
  • "-i" で複数併記した、パスフレーズ未入力の秘密鍵

等を利用する ssh 起動を行った場合には、 パスフレーズ入力待ちでブロックされてしまいます。 (特に複数の鍵を使用する場合の) パスフレーズ未入力に関しては注意が必要です。