Techniical-support

sudoコマンドの使い方でPATH環境変数の違いを調べてみた

こんにちは、ディーネットの山田です。

余談ですが、AmazonConnectで海外電話番号を購入し、電話をかけまくっていたら国際電話扱いでカケホーダイ対象外で1000円くらい通話料の請求が来たのでテストで購入する際は、"050"を買いましょう... (この記事に関係ない内容ですみません)

さて、今回のネタは、rootユーザに昇格する際などに使用するsudoコマンドのオプションの違いでPATH環境変数がどのように異なるのか検証してみたいと思います。

PATHの値が昇格方法によって異なるので、バイナリの設置場所によってはPATHが通っていないといったことが発生します。

sudoコマンドとは

他のユーザに切り替え(スイッチ)しなくても、他のユーザとしてコマンドを実行することのできるコマンドです。
簡単に言うと、rootユーザに切り替えなくても、rootユーザとしてコマンドを実行することが出来ます。

どんなときに使うの

一般ユーザ(例えばdenet)で、ターミナルにログインしている状態で、"yum install"を使ってパッケージをインストールしたり起動中のサービスを再起動する場合に、rootユーザでなくとも利用したい場合に使います。

実際に比較を行ってみる

今回使用するroot昇格コマンド一覧

  • sudo su -
  • sudo -i
  • sudo -s
    いずれも、rootユーザの権限に昇格することが可能です。

一般ユーザの場合

echo ${PATH}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/yamada/.local/bin:/home/yamada/bin

"sudo su -"の場合

echo ${PATH}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

"sudo -i"の場合

echo ${PATH}
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

"sudo -s"の場合

echo ${PATH}
/sbin:/bin:/usr/sbin:/usr/bin

それぞれのsudoオプションについて

"-i"とは

パスワード・データベースの変身対象ユーザの項目でログイン・シェルとして指定されているシェルを実行する。
すなわち、 .profile や .login といったログイン用のリソース・ファイルが、 シェルによって読み込まれることになる。
コマンドを指定すると、 それがシェルに渡され、シェルの -c オプションを使って実行される。 コマンドを指定しない場合は、対話的シェルが起動される。
sudo は、 シェルを実行する前に、変身対象ユーザのホームディレクトリに移動しようとする。
コマンドの実行は、ユーザが普通にログインしたときの環境とほぼ同じ環境で行われる。
sudoers ポリシーを使用している場合に、 -i オプションがコマンドの実行環境にどんな影響を与えるかについては、 sudoers(5) のマニュアルの「コマンド環境」セクションに説明がある。
sudoのマニュアル

"-s"とは

環境変数 SHELL が設定されていれば、そのシェルを、 設定されていなければ、パスワード・データベースで sudo を起動するユーザのシェルとして指定されているシェルを実行する。
コマンドが指定されている場合は、それをシェルに渡し、シェルの -c オプションを使って実行する。コマンドが指定されていない場合は、 対話的シェルを開く。
sudoのマニュアル

比較結果

上記の結果を見ていただいて一目瞭然だと思いますが、"sudo su -"と"sudo -i"では、"/usr/local/bin"に違いがありますね。
また、"sudo -s"に至っては"/etc/sudoers"で定義されている"secure_path"のみのPATHになっているので、ユーザ設置の実行バイナリにPATHが通っていないといったことがおきます。

個人的には、"sudo su -"より"sudo -i"を使ってしまいがちなのですが、環境変数に違いが出てくるので、
rootユーザに昇格する際は、"sudo su -"を使っていくのが最適ですね。