83
85

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

改めてsudoについて調べてみた

Posted at

要点

⑴sudoした場合は環境変数を引き継がない。
⑵sudoで環境変数を引き継ぐにはsudo -E some_commandかsudoersにenv_keepを書く。
⑶sudo ${pathが通っているコマンド}を実行する場合、カレントユーザのpathによって実行するコマンドが決まる。

sudoについて調べたきっかけ

今まで**「root権限でコマンドを実行したい場合」**にsudoを使っていたのですが、
とあるrubyのスクリプトをsudoで実行したところ以下のようなエラーがでました。

 $ sudo /usr/local/hoge/fuga.rb
/usr/local/hoge/fuga.rb:3:in `require': no such file to load -- thor (LoadError)
	from /usr/local/hoge/fuga.rb:3

rootとカレントユーザで見てるgemが違うのか?と思い、以下のようにgemのインストール済みのlistを見てみたところ、やっぱり入っていた。であれば、sudoでコマンド実行時にエラーが出てくるのはおかしいので、おそらくsudoについて誤認識をしていると感じ、改めてsudoについて調べてみました。

$ sudo gem list | grep thor
thor (0.19.1)

sudoとは

ITproの記事によれば以下の通りでした。

sudoは,指定したユーザーでコマンドを実行する。デフォルトではroot権限で実行する。suの代わりに使われることが多い。sudoを実行するには,あらかじめ/etc/sudoersファイルに権限を与えられるユーザーとコマンドを設定しておく必要がある。

ref: http://itpro.nikkeibp.co.jp/article/COLUMN/20071205/288862/

sudoを実行するには,あらかじめ/etc/sudoersファイルに権限を与えられるユーザーとコマンドを設定しておくということだったので、現在の/etc/sudoersの確認をvisudoで行い、自分のユーザないしグループがsudoers登録されていることを確認しました。

ref: http://www.maruko2.com/mw/%E4%B8%80%E8%88%AC%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92_sudo_%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B

そして、調べていくうちにsudoは/etc/sudoersのデフォルト設定では環境変数を引き継がないということを思い出し、もしsudoで環境設定を引き継ぎたい場合は設定ファイルにための設定をenv_keepで行う(※1)か、もしくはsudo -E some_commandによってコマンド実行すれば良い(※2)ということがわかりました。

ref※1: http://qiita.com/akito1986/items/e9ca48cfcd56fdbf4c9d
ref※2: http://mikio.github.io/article/2012/03/10_sudo.html

エラー原因の解決へ

sudoについて調べてわかった事のうち解決の手がかりになりそうな事は、自分の環境でsudoしてもpathは引き継がないということでした。

そこで、sudoした場合にどのgem使っているのか調べたところ、以下のようになりました。

# カレントユーザの場合
$ which gem
/usr/local/rbenv/shims/gem
$ which ruby
/usr/local/rbenv/shims/ruby

# sudoした場合
$ sudo which gem
which: no gem in (/usr/bin:/bin:/usr/sbin:/sbin)
$ sudo which ruby
/usr/bin/ruby

つまり、sudo gem list | grep thorで出ていたthorは、カレントユーザの環境変数であるpathの通っているgem(/usr/local/rbenv/shims/gem)をsudoで実行し結果表示したに過ぎ無いということです。sudoした場合、そもそも別のrubyを使用していることがわかり、gemにもpathは通っていませんでした。

なお、当然ですが環境変数を引き継ぐための最も簡単な方法として-Eをつけて実行したところうまく行きました。

sudo -E /usr/local/hoge/fuga.rb
83
85
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
83
85

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?