emacs wiki の cygwin 関連の情報に注意してください:
http://www.emacswiki.org/emacs/TrampMode
私は EmacsW32 を使用していませんが、Cygwin と NT Emacs で ssh 経由の TRAMP をうまく使用しています。
sshエージェントなしでTRAMPを動作させることはできませんでした(つまり、資格情報の入力を求めます). エージェントを使用することにも満足している (そして、必要に応じてキーを生成し、authorized_keys ファイルを追加した) と仮定すると、私にとって有効なアプローチは次のとおりです。
- cygwin から ssh-agent を実行します。
- cygwin 経由で NT Emacs を起動します (ssh-agent 環境変数を継承するため)。
- TRAMP メソッドとして「sshx」を使用します (各ファイル パスで手動で指定できますが、デフォルトにすることをお勧めします
(setq tramp-default-method "sshx")
)。
これらのポイントはすべて Wiki でカバーされていますが、多少自動化することもできます。
ステップ 1 では、私の bash プロファイルは、ssh エージェントがまだ実行されていない場合は自動的に開始し、ID の有効期限が切れている場合はパスフレーズの入力を求めます。(以下のコードを参照してください。)
ステップ 2 では、emacs を起動するための Windows ショートカットのターゲットは次のようになります。
C:\cygwin\bin\bash.exe --login -c "env HOME=\"`cygpath '%APPDATA%'`\" /cygdrive/c/emacs/emacs-23.1/bin/runemacs.exe"
引数は、私の bash プロファイルが実行されることを意味します。--login
これにより、emacs が開始される前にステップ 1 が常に処理されることが保証されます。
( HOME
TRAMP には設定は必要ありませんが%APPDATA%
、NT Emacs ではデフォルトです。これにより、Cygwin のホーム ディレクトリが優先されなくなります。したがって、このショートカットを使用して実行するかどうかに関係なく、emacs 構成の一貫性が保たれます。)
最後に、ssh-agent を管理する cygwin .bash_profile のコードを次に示します。少しハックですが、私にとってはうまくいきます。
4 時間 (14400 秒) 後に ID が期限切れになることに注意してください。その後、TRAMP がハングアップする可能性があるため (前述のように、資格情報の入力を求められることはありませんでした)、この問題に注意してください。C-g
接続しようとするのを止めるために入力します。接続を再開するには、通常、別の cygwin シェルを起動し、パスフレーズを再入力するだけで、TRAMP は再び満足します。ときどき応答しないままになることがありますが、*tramp* バッファを強制終了すると解決します。もちろん、ID を期限切れにしないことで、この問題を回避できるはずです。
SSH_ENV="${HOME}/.ssh/environment"
# Run ssh-agent, if one is not already running
function start_agent {
echo "Initialising new SSH agent..."
/usr/bin/ssh-agent -t 14400 | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" >/dev/null
/usr/bin/ssh-add;
}
# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" >/dev/null
#ps ${SSH_AGENT_PID} doesn't work under cywgin
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ >/dev/null || {
start_agent;
}
#if our ssh-added identity has expired (see -t option to ssh-agent)
#then we need to re-add it
if ! /usr/bin/ssh-add -l >/dev/null; then
/usr/bin/ssh-add;
fi
else
#no ssh-agent running at the moment
start_agent;
fi