sudoersの書き換えに失敗してsyntax errorとか言われた→直した

Ubuntu(11.10)では /etc/sudoers というファイルがあって、*1
「新しく定義を追加する場合は /etc/sudoers.d/ 以下に書くことをオススメするよ」
的なことが書いてあります。つまり sudo するたびにパスワードを聞かれるのが鬱陶しいので
NOPASSWD 属性を付けようとしたんですが、あまりにもくだらない失敗をやらかしたのでメモ。

sudoers の書式は "man sudoers" すればとても詳しく出てくるんですが、
#(シャープ記号)で始まる行はコメントなんですね。
んで、Ubuntuの場合 /etc/sudoers の末尾に

#includedir /etc/sudoers.d

とか書いてある。
てっきり「これをコメントアウトすれば /etc/sudoers.d の中身が有効になるのかな」と思って
行頭の # を削除してドヤ顔で sudo してみたらエラー吐かれました。
結論から言うとこれコメントじゃなかったんですね。

#includedir それ自体がディレクティブになっているようで、
一旦書き換えて保存してしまうと、sudo がsyntax errorを吐いて使えなくなります。*2

  1. sudo が使えないのは困るのでsudoersを直したい
  2. そのためには root 権限が必要
  3. sudo vi /etc/sudoers → エラー
  4. sudo su - → エラー
  5. root のパスワードは隠蔽されているから su - を直接叩くわけにもいかない
  6. 最初に戻る

結局recovery modeでブートし、読み書きモードでファイルシステムをマウントし、
rootシェルから修正を行う羽目になりました。
目的はユーザがパスワード無しに sudo できるようにすることだったので、
まず /etc/sudoers の includedir を #includedir に直し、
/etc/sudoers.d/username に

username ALL=(ALL) NOPASSWD:ALL

と書き、

$ chmod 0440 /etc/sudoers.d/username

としてノーマルブート→解決となりました。*3

*1:このファイル自体はUbuntu特有ではないんだけど。

*2:具体的なメッセージは忘れた。

*3:余談ですが、sudoersではユーザやグループはもちろん、コマンド単位でもパスワードの問い合わせの有無を記述できるみたいです。