Emacsの中でsudoする方法 〜これでrootによる操作も楽々〜

Emacs本、増刷されました!


みなさん、Emacsを使っていて、突然rootでの操作がしたいと思ったとき、どうしてますか?
たとえば、ユーザに書き込み権限のないファイルに書き込みたいとき、root権限でコマンドを実行したいとき。
わざわざターミナルに移動してsuやsudoを使っていたりしませんか?
面倒ですよね。


どうせなら、Emacsの中で直接sudoを使ってみたいですね。
ここで紹介するsudo-ext.elがその願いを叶えてくれます。


注意! 2011-01-17 月更新


機能

sudo-ext.elが提供する機能はふたつです。


root権限でファイルを編集する

Emacsの中でroot権限でファイルを編集するには、Trampを使う方法があります。
しかし、Trampは起動が遅くて待たされるのでイライラします。
僕は使っていません。


一方、sudoパッケージ(シェルコマンドの)にはsudoeditというコマンドが付属しています。
sudoeditは元のファイルを一時ファイルにコピーし、編集後に元のファイルに書き戻す方法でroot権限による編集を実現しています。
高速に動作しますが、いちいちターミナルでコマンドを実行しないといけないので面倒です。


sudo-ext.el導入後は、M-x sudoeditを実行すればよいです。
C-x #で編集を終了します。


M-!等をsudo対応にする

Emacsには、シェルコマンドを実行するコマンドがたくさんあります。
M-!、M-|、M-& (async-shell-command)、M-x grep、M-x executable-interpretなどです。
これらのコマンドは、sudoがパスワードを聞いてくる場合に正しく動作しません。


しかし、sudo-ext.elを導入すれば、Emacsがパスワードを聞いてくるようになり、正しく動作してくれます。
M-! sudo lsと実行してみてください。
「Sudo Password: 」とプロンプトが出てきます。


インストールと設定

いつものようにEmacsWikiに置いています。
インストールは、auto-install.elを使ってM-x install-elisp-from-emacswiki sudo-ext.el を実行してください。


M-x sudoeditはemacsserverを使っているので、あらかじめサーバを有効にしておく必要があります。
gnuclientを使っている場合は (gnuserv-start) を加えてください。



(server-start) ;  sudoeditで使う(require 'sudo-ext)




カニズム



sudo -v

sudoには、有効時間があります。
初めてsudoを使う場合、あるいは前回のsudo実行よりも時間がたっている場合は、パスワードを聞いてきます。
有効時間以内に続けてsudoを実行しても、パスワードは聞いてこなくなります。


sudo command形式で実行すると、パスワードを聞いてくるかどうかがわからないため、Emacsとしては扱いづらいものがあります。
そこで「sudo -v」が役に立ちます。
このコマンドはsudoの有効時間を延長します。
そのため、この直後にsudoを実行すればパスワードを聞いてこなくなります。


sudo-ext.elでは、初めにsudo -vを実行しておくように各種コマンドにアドバイスをかけています。


sudo -K

「sudo -K」コマンドは、sudoを有効時間を0にします。
つまり、次のsudo実行時には確実にパスワードを聞いてくるようになります。
M-x sudo-K は、Emacs内でsudo -Kを実行します。
普段は使うことはありませんが、動作確認に使います。


カスタマイズ



他のコマンドもsudo対応にする

sudo-ext.elをロードするば、一通りのコマンドはsudo対応になります。
他のコマンドをsudo対応にするには、sudo-adviceマクロを使います。
第1引数にコマンド名、第2引数にシェルコマンドの引数の0始点のインデックスを指定します。



;;; sudo-ext.elより抜粋;; (shell-command COMMAND &optional OUTPUT-BUFFER ERROR-BUFFER) ; 第0引数(sudo-advice shell-command 0)
;; (shell-command-on-region START END COMMAND 略) ; 第2引数(sudo-advice shell-command-on-region 2)
;; M-x compileやM-x executable-interpretが内部で呼んでいる(sudo-advice compilation-start 0)





うまくいかないときは

http://d.hatena.ne.jp/rubikitch/20110117/sudo を参照してください。