2012/03/11 現在 Emacs Tramp の設定方法

Emacs の Tramp でリモートのファイルを編集したいと思ったものの、
検索等で色々見つかる設定が古くなっていたりとどうにもうまくいきませんでした。
ですので 2012/03/11 現在での cygwin と Mac でうまく行った方法をメモしておきます。
少し長いです。。

前提

流れ

  1. ssh-agent の設定
  2. ssh-config の設定
  3. Emacs の起動方法
  4. tramp の設定
  5. cygwin との戦い
  6. Solaris との戦い

ポイントは cygwin の場合の Emacs の起動方法にありました。

ssh-agent の設定

Tramp でパスワードを要求されるとそのやり取りを解決できず、
そのまま固まってしまいますので ssh-agent を使ってパスフレーズ入力を解決します。
ノーパスの秘密鍵を作るよりは幾分か良いでしょうし、
セキュリティに問題ないと判断できれば Tramp を使わなくても利用すると便利です。


鍵認証で ssh 接続を試みるとパスフレーズを要求されますが、
1度登録しておくとその手間を省いてくれるものです。
ssh-add コマンドで認証鍵を指定すると
認証鍵のパスフレーズが要求されますので入力すると準備完了です。

% ssh-agent zsh(使っているshell)
% ssh-add hogehoge(秘密鍵を指定)

Enter passphrase for hogehoge : (パスフレーズを求められるので入力)
Identity added: hogehoge (完了)


ターミナルを再起動したりした後は ssh-agent が起動している必要がありますので、
zshbash ログイン時に1度だけ自動的に立ち上がるようにすると便利です。
詳細については
ssh-agentの使い方 - http://goo.gl/CtEQ1
などを参考にしてみてください。


必要に応じて秘密鍵を手動で登録するようにしていますので、上記から少し変えて

# ssh-agent 用
agentPID=`ps gxww|grep "ssh-agent]*$"|awk '{print $1}'`
agentSOCK=`/bin/ls -t /tmp/ssh*/agent*|head -1`
if [ "$agentPID" = "" -o "$agentSOCK" = "" ]; then
    unset SSH_AUTH_SOCK SSH_AGENT_PID
    eval `ssh-agent`
else
    export SSH_AGENT_PID=$agentPID
    export SSH_AUTH_SOCK=$agentSOCK
fi

としています。
これで ssh-agent が起動していなければ起動し、
起動していれば必要な情報を環境にセットします。

ssh-config の設定

必要なければ飛ばしても良いのですが便利なので設定しておきます。
当たり前な人には当たり前なので設定済みだと思いますし、読み飛ばしてください。。


例えば hogehoge.piyo.com に AAA ユーザで hoge 鍵を使ってログインするとします。
通常であれば長い ssh コマンドのオプションを使ってログインしますが、
~/.ssh/config に

Host hoge
     HostName hogehoge.piyo.com
     IdentityFile ~/.ssh/hoge
     User AAA

と書いておくことで

ssh hoge

とするだけでログインできるようになります。


tramp で接続する際にもこの設定で記述を少なくできますので楽ができます。

Emacs の起動方法

Windows で普段は runemacs.exe をダブルクリック実行して起動している人に必要なポイントです。
Emacs を起動する際は、cygwin で PATH を通して
cygwin 上で runemacs を実行して起動するようにしてください。
これによって Emacsssh-agent を利用できるようになります。


Mac の場合は ターミナルなどで ssh-agent を起動しておけば
後から起動した Emacsssh-agent 有効になっているようです。

tramp の設定

なにはともあれ最新版をダウンロードして .emacs.d の下などに配置します。

(add-to-list 'load-path "~/.emacs.d/elisp/tramp-2.2.4/lisp/")
(require 'tramp)

ここでは ホームディレクトリの .emacs.d/elisp 以下に展開しました。


基本的にはこれだけで使えるようになります。
C-x C-f などしてから

Find file or URL: /ssh:AAA@hoge:/

すればOK・・・ですが

cygwin との戦い

昔はcygwin を使っている環境で tramp を使おうとすると上記のままでは失敗していたようです。
これを解決するための様々な情報がネットや本で見つかります。
putty の plink を使う方法などがそうです。
これは cygwin に含まれていた openssh のバージョンが古いために起きる問題を回避する方法でした。
現在は cygwin の ssh で問題なく動作します。


ただし、下記の tramp の設定を追加してください。

(setq-default tramp-default-method "sshx")

これで plink など必要とせず、ssh-config の設定を引き継いで tramp が使えます。
C-x C-f して

Find file or URL: /sshx:AAA@hoge:/

すれば tramp できます。
ssh ではなく sshx とするところに注意してくださいね。


ちなみに Mac でも sshx で動きますので環境による切り分けは不要でした。

Solaris との戦い

さあこれでつながる・・・と tramp を使用していると、
さっきはつながっていたサーバーに

Couldn't find exit status of `test -d "trampしようとしたパス" unset'

とエラーが出て、2度目以降繋がらなくなりました。
なんてこった・・・。


これはSolaris など一部のサーバーで発生しました。
tramp はデフォルトでは .emacs.d の下に tramp ファイルを作成し、
再接続時などの情報を保存するようです。
どうもこれが悪さをして繋がらなくなるようなので、

(setq-default tramp-persistency-file-name nil)

とすることで回避可能です。


これでようやく一通りすっきりと tramp が使えるようになりました。

終わりに

最終的に tramp 自体の設定は

(add-to-list 'load-path "~/.emacs.d/elisp/tramp-2.2.4/lisp/")
(require 'tramp)
(setq-default tramp-default-method "sshx")
(setq-default tramp-persistency-file-name nil)

とすっきりしたものとなっています。
多段用の設定は別にしていますが、
多段の場合も中継サーバーの ssh の config をうまく設定することで便利に接続できるはずです。


古い Tramp や plink の話、Meadow 用の設定など入り交じって訳がわからなくなりつつありますが、
現在は ssh-agent を利用して sshx を指定すれば特に問題なく利用できるようです。
環境に影響を受けやすいため設定も面倒な事が多いですが、
その分便利なことも多いですから試してみる価値はあると思います!!