Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
84
Help us understand the problem. What is going on with this article?
@genre

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

More than 5 years have passed since last update.

要点

⑴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
84
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
genre

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
84
Help us understand the problem. What is going on with this article?