最初は上手く行っていたが…
デフォルトであるVirtualBoxの共有システムだと色々と不具合があったので、フォルダの共有方式をNFSにしました。ただし、その場合vagrant up
やvagrant reload
などをした時毎度毎度sudoがパスワードを聞いてきます。
それを回避するための/etc/sudoers
に追記する内容が公式ドキュメントに記述されています。
NFS - Synced Folders - Vagrant Documentation
注: /etc/sudoers
はvisudo
コマンドで編集してください。保存する前にシンタックスをチェックし、エラーがあれば教えてくれます。直接編集して、万一記述ミスがある状態で保存されてしまうと、sudoが使用不能になり手も足も出なくなる可能性があります。
私はホストマシンがOS Xなので、以下を追記しました。
Cmnd_Alias VAGRANT_EXPORTS_ADD = /usr/bin/tee -a /etc/exports
Cmnd_Alias VAGRANT_NFSD = /sbin/nfsd restart
Cmnd_Alias VAGRANT_EXPORTS_REMOVE = /usr/bin/sed -E -e /*/ d -ibak /etc/exports
%admin ALL=(root) NOPASSWD: VAGRANT_EXPORTS_ADD, VAGRANT_NFSD, VAGRANT_EXPORTS_REMOVE
当初、この内容を追記したらパスワードを聞かれなくなっていました。
何故かまた聞いてくる
しかし、しばらくすると何故かまたパスワードを聞いてくるようになりました。何度調べても記述は間違っていないのに何故…
犯人確保
sudoで実行されたコマンドのログは/var/log/system.log
に吐き出されているようなので、そこを調べてみます。
user@host:~$ tail /var/log/system.log | grep sudo
Jan 13 03:11:11 host sudo[5071]: user : TTY=ttys001 ; PWD=/path/to/vagrant/dir ; USER=root ; COMMAND=/usr/bin/sed -E -e /^# VAGRANT-BEGIN:( 501)? 01234567-89ab-cdef-0123-456789abcdef/,/^# VAGRANT-END:( 501)? 01234567-89ab-cdef-0123-456789abcdef/ d -ibak /etc/exports
Jan 13 03:11:11 host sudo[5075]: user : TTY=ttys001 ; PWD=/path/to/vagrant/dir ; USER=root ; COMMAND=/usr/local/opt/coreutils/libexec/gnubin/tee -a /etc/exports
Jan 13 03:11:11 host sudo[5079]: user : TTY=ttys001 ; PWD=/path/to/vagrant/dir ; USER=root ; COMMAND=/usr/local/opt/coreutils/libexec/gnubin/tee -a /etc/exports
Jan 13 03:11:11 host sudo[5083]: user : TTY=ttys001 ; PWD=/path/to/vagrant/dir ; USER=root ; COMMAND=/usr/local/opt/coreutils/libexec/gnubin/tee -a /etc/exports
Jan 13 03:11:11 host sudo[5085]: user : TTY=ttys001 ; PWD=/path/to/vagrant/dir ; USER=root ; COMMAND=/sbin/nfsd restart
犯人はteeコマンドでした。sudoersでは**/usr/bin/teeにNOPASSWDが設定されていて、しかし実際に実行されているのは/usr/local/opt/coreutils/libexec/gnubin/tee**だったためにNOPASSWDの対象になっていなかった、ということです。
そういえばちょっと前にHomebrewでcoreutils入れました……(笑)
2017/02/10 追記
coreutils
を入れただけではコマンドがcoreutils
のものには変わりません。私はcoreutils
を入れたのに加え、.bash_profile
でPATH
の先頭に、プレフィックス(先頭のg)がついていない実行ファイルのディレクトリ(/usr/local/opt/coreutils/libexec/gnubin/
)を追記していたため、システムのコマンド(今回の場合tee
)が上書きされてこちらが実行されていました。
つまり、この問題の原因はcoreutils
を入れていたことそのものというよりは、プレフィックスなしの実行ファイルのあるパスをPATH
の先頭に追加していたこと、ということになります。
対処
というわけで、coreutilsのteeコマンドでもパスワードを省略できるよう、sudoersにまた少し追記します。
Cmnd_Alias VAGRANT_EXPORTS_ADD = /usr/bin/tee -a /etc/exports
# ↓この行追記
Cmnd_Alias VAGRANT_EXPORTS_ADD_CU = /usr/local/opt/coreutils/libexec/gnubin/tee -a /etc/exports
Cmnd_Alias VAGRANT_NFSD = /sbin/nfsd restart
Cmnd_Alias VAGRANT_EXPORTS_REMOVE = /usr/bin/sed -E -e /*/ d -ibak /etc/exports
# ↓この行中に、上に追記したCmnd_Aliasを追記
%admin ALL=(root) NOPASSWD: VAGRANT_EXPORTS_ADD, VAGRANT_EXPORTS_ADD_CU, VAGRANT_NFSD, VAGRANT_EXPORTS_REMOVE
これにて一件落着。