セキュアなサーバアクセスを行う上で 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 起動を行った場合には、 パスフレーズ入力待ちでブロックされてしまいます。 (特に複数の鍵を使用する場合の) パスフレーズ未入力に関しては注意が必要です。