visudoとは
visudoはsudoersファイルを安全に編集するコマンドです。
visudoは複数の同時編集に対してsudoersファイルをロックし、基本的な健全性チェックを提供し、解析エラーをチェックします。
sudoersとは
どのユーザーが何を実行できるかを記述した設定ファイルのことです。
/etc/sudoers に設定ファイルがあります。
ファイルのロック
$ ll /etc/ | grep sudoers
-r--r----- 1 root wheel 2299 7 11 12:13 sudoers
$ sudo visudo
(編集中にもう一つの画面から下記を実行)
$ ll /etc/ | grep sudoers
-r--r----- 1 root wheel 2299 7 11 12:13 sudoers
-rw------- 1 root wheel 2299 7 11 12:13 sudoers.tmp
$ sudo visudo
visudo: /etc/sudoers busy, try again later
visudoを実行している間はロックファイルとして/etc/sudoers.tmpが作成されています。
この状態でもう一度visudoを実行するとエラーが出て編集ができない状態になっていたので、これでファイルがロックされていることがわかります。
解析エラーのチェック
manコマンドの日本語訳です。
visudoは編集後にsudoersファイルを解析し、構文エラーがあれば変更を保存しません。 エラーが見つかると、visudoはエラーが発生した行番号を示すメッセージを表示し、ユーザーは `` What now? ''プロンプトを受け取ります。 この時点で、ユーザはsudoersファイルを再編集するために
e 'を、変更を保存せずに終了するためにx'を、あるいは変更を終了して保存する `Q 'を入力することができます。 visudoが解析エラーがあると考えている場合は、sudoも同様にエラーが修正されるまで誰も再びsudoできないため、 `Q 'オプションは非常に注意して使用する必要があります。
実際にvisudo で適当にaを追記したところ下記の表示になりました。
$ sudo visudo
>>> /etc/sudoers: syntax error near line 31 <<<
What now?
Options are:
(e)dit sudoers file again
e(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)
sudoが使えなくなっても大丈夫な環境なので、Qで保存をしてみるとsudoが使えなくなりました。
$ sudo visudo
>>> /etc/sudoers: syntax error near line 31 <<<
What now?
Options are:
(e)dit sudoers file again
e(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)
What now? Q
$ sudo visudo
>>> /etc/sudoers: syntax error near line 31 <<<
sudo: parse error in /etc/sudoers near line 31
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
$ sudo ll
>>> /etc/sudoers: syntax error near line 31 <<<
sudo: parse error in /etc/sudoers near line 31
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
なるほど、sudoersの編集を行う場合にミスるとsudoが使えなくなるので、visudo以外でsudoersを修正するのは危ないということですね。
今回は検証のためにエラーがある状態でQを選択しましたが、使う場合には気をつけてください。