Emacsでsudoを介してファイル編集する時、EasyPGを使ってパスワード入力を省略する

Emacsでは、以下のように編集権限がないファイルをsudoを介して編集することが可能です。

その際、当然ながらrootのパスワードを入力する必要がありますが、それをEasyPGを使うことで省略することができました。

auth-source

Emacsには、auth-sourceという認証情報を格納したファイルを扱うためのパッケージがデフォルトで付属されており、
いろいろなパッケージから認証の処理が必要な時に参照されているようで、
Trampでもパスワードが必要な時に、このパッケージを利用しています。

具体的には、 接続しようとしているメソッド/ホスト/ユーザに対応するエントリが、
auth-sources に定義されたファイルにあれば、その認証情報を使います。

auth-sources には、デフォルトで以下のファイルが設定されており、

  • ~/.authinfo
  • ~/.authinfo.gpg
  • ~/.netrc

~/.authinfo.gpgにエントリを登録することで、auth-sourceがEasyPGを使って認証情報を返してくれます。

設定

以下の行を、~/.authinfo.gpgに加えます。

machine localhost login root password ... port sudo

"..."の部分は、実際のパスワードです。

そして、~/.emacsなどに以下の設定を加えます。

(defadvice auth-source-search (before ~fix-system-name activate)
  (let ((host (ignore-errors (plist-get (ad-get-args 0) :host))))
    (when (and host (string= host (system-name)))
      (plist-put (ad-get-args 0) :host "localhost"))))

Trampは、ホスト名を使ってauth-sourceから認証情報を探しますが、
それだと認証ファイル側に自分のホスト名を記述しなければならなくなり、作業マシンが変わると面倒です。
なので、 auth-source-search に渡されたホスト名が自ホスト名だったら、"localhost"に置換しています。

その他

自分自身、まだauth-sourceに詳しくなく、"localhost"への置換はもしかしたらバッドプラクティスかもです。
何かご存知の方がいれば是非。

この設定で、rootパスワード入力は省略できますが、gpgファイルの秘密鍵入力が必要になるので、
意味ねーじゃんって人もいるかも知れませんが、
私の場合は、他にもauth-sourceを使う機能を使っているため、パスワード入力が一度で済むので便利になりました。