Emacsからリモートファイルをいじくる

今までリモートのファイルを開くときはいったんローカルのemacsを閉じて

sshでリモートにログインしてからまたemacsを立ち上げていた.

eshellからsshで接続しても,emacsがeshell上で動かないので何も操作ができないから...

さすがにクリティカルなファイルの編集以外はできればemacsから行いたいと思ってたんだけど,

実はこんな方法があった.

TRAMP

TRAMP(TransparentRemoteAccessMultipleProtocol)はemacsからリモートファイルを操作する機能を提供するパッケージ.

emacs21.4から標準でパッケージで入っているようです.

使うのには

;; 標準パッケージなら
(require 'tramp)
;; 自分でインストールしたなら
(add-to-list 'load-path "~/to/site/lisp/tramp/lisp/")
(require 'tramp)

でおk.

ローカルファイルを編集する

ローカルファイルを一時root権限で開くなら,

C-x C-f /sudo::/etc/rc.common

でいける.らくちん.

リモートファイルを開く

#1
C-x C-f /ssh:username@hostname:.emacs
#2
C-x C-f /ssh:username@hostname:/home/username/.emacs
#3
C-x C-f /ssh:username@hostname:/var/sys/log/

と.簡単.

#1はログインしたユーザのホームの".bashrc"ファイルを開く.つまりホームからの相対パスをコロン以降に書くことができる.

#2はフルパスをコロン以降に書く方法.

#3はフォルダを開く.dired(フォルダビューア)が立ち上がる.便利.

リモートファイルをroot権限で開く

当たり前だけど,リモートにrootで入る事ができない.いや,しちゃいけない.

というわけで,いったん一般ユーザで入ってから,sudoしてファイルを開く事が好ましい.

こんな場合はマルチホップというものを使う.

C-x C-f /multi:ssh:username@hostname:sudo:root@hostname:/etc/apt/sources.list

というかんじ.この'multi'という最初のメソッドは複数のメソッドを直列化するという意味.

まず,usernameでリモートhostnameにsshログインして,次に'/etc/apt/sources.list'をrootにsudoして開くというもの.

なんと単純.

これでかなりの作業がemacsからできる.

ちなみに,このマルチホップを使うと,複数のsshサーバを経由してサーバを編集するとか複雑な事も可能になる.

注意点

当たり前だけど,emacsはそこらかしこにバッファファイルを作る.最後にチルダのついたアレです.

普通に作業している分には問題ないんだけど,root権限だとへんなところにバッファを作るとアレゲな場合が十二分にあります.

(setq make-backup-files nil)

.emacsに入れておくと,そもそもバックアップファイルは作りません.

(add-to-list 'backup-directory-alist
                  (cons tramp-file-name-regexp nil))

だと,trampで開いたファイルに関してはバックアップファイルを作りません.

自分は後者にしてます.

あと,最後に

C-x C-f /multi:ssh:username@hostname:sudo:root@hostname:/etc/crontab

とかしちゃいけません.

まとめ

強力すぎる.上の例だとsshしかつかってないけど,いろんなプロトコルが使えるっぽい.

これでかなりの仕事がさくさくemacs上から行える.

参考文献