LoginSignup
8
7

More than 5 years have passed since last update.

VagrantでNFSで同期した時のsudoパスワードがある時期からなぜか省略されなかった話

Last updated at Posted at 2016-01-12

最初は上手く行っていたが…

デフォルトであるVirtualBoxの共有システムだと色々と不具合があったので、フォルダの共有方式をNFSにしました。ただし、その場合vagrant upvagrant reloadなどをした時毎度毎度sudoがパスワードを聞いてきます。

それを回避するための/etc/sudoersに追記する内容が公式ドキュメントに記述されています。

NFS - Synced Folders - Vagrant Documentation

注: /etc/sudoersvisudoコマンドで編集してください。保存する前にシンタックスをチェックし、エラーがあれば教えてくれます。直接編集して、万一記述ミスがある状態で保存されてしまうと、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_profilePATHの先頭に、プレフィックス(先頭の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

これにて一件落着。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7