sudo時に環境変数PATHが引き継がれない時の対策

こんにちは。今回のテーマは『sudo時に環境変数PATHが引き継がれない時の対策』です。sudoはいちいちrootにならずともコマンドを実行できる安全で便利なツールですが、その安全性を重視した設定のために少々不便な時もあります。今回はsudo時に環境変数PATHが引き継がれない対策を記事にしました。


【目次】
sudoでは設定したPATHが初期化されることがある
原因はsudoの設定
まずは普通にPATHの追加設定
/etc/sudoersの設定を変更する

sudoでは設定したPATHが初期化されることがある

筆者はこれまでAndroidの開発はArch Linuxで行っていて、最近Xubumtu環境に引っ越してきました。Arch Linuxの時にはユーザーホームディレクトリ上に展開したAndroid-sdkにPATHを通してadbをsudoで実行できていました。しかしXubumtuではsudoで実行時に

sudo: adb: command not found

と言われてしまします。PATHが通っていないよと言われているわけです。

原因はsudoの設定

sudoの設定によっては環境変数を引き継がなかったりリセットする設定なっていることがあり、これが原因でsudo時にPATHが引き継がれません。
前述の通り、これらの設定はディストリビューションによって異なります。全て調べたわけではないですが、UbuntuファミリーやCentOSではPATHが引き継がれないようです。ディストリビューションによって微妙に設定が異なっていますが、基本的には同じような対策でOKです。今回はUbuntuを例にして説明したいと思います。

Ubuntuではenv_resetという設定がされていて、sudo時には環境変数がsecure_pathの設定値にリセットされるようになっています。またenv_keepにPATHがないためにユーザー設定のPATHが引き継がれません。これらの設定を変更することでsudo時にもPATHが引き継がれるようになります。

まずは普通にPATHの追加設定

PATHの追加

まずはPATHを追加してみます。今回はユーザーディレクトリに展開したandroid開発ツールを追加してみます。/home/ユーザー名/sdk/android-sdk-linuxを追加してみます。
PATHの追加例

$ export PATH=$PATH:/home/ユーザー名/sdk/android-sdk-linux/platform-tools

この設定を現在のログインユーザーで永続させたい場合は~/.bashrcに上記コマンドを書き込んでおくと良いと思います。尚、複数のユーザーに共通でPATHを追加したい場合は/et/profileに書き込んでおくと便利かと思います。

PATHが追加されたかどうか確認

以下のコマンドで確認します。

$ echo $PATH

先ほど追加したパスが追加されていればOKです。この状態だとadbという追加したパスにあるアプリケーションを実行可能です。当然、追加したパスにより実行可能となるアプリケーションは異なります。今回はadbを実行してみます。
実行例

$ adb devices

実行結果は今回は重要ではありません。エラーが出ずに実行できればOKです。

/etc/sudoersの設定を変更する

では前段落で実行したadbをsudoで実行できるように設定してきます。まずはrootユーザーになり、visudoを実行して/etc/sudoersを編集します。

$ su -
root# visudo

まずはenv_resetとsecure_pathの設定をコメントアウトします。

Defaults	env_reset
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

次に以下のようにPATHを保持する設定を追記します。

Defaults	env_keep += "PATH"

修正した全体を見てみると以下のようになっているはずです。
01

この状態でログインユーザーに戻って先ほどsudo adbが実行可能か試してみましょう。

$ sudo adb devices

先ほどとは異なりちゃんと実行できたと思います。

最後に

sudo時の環境変数の引き継ぎ、知っていればなんてことない設定ですが、咄嗟には少々戸惑うものでもあります。本記事が少しでもお役に立てば幸いです。
【関連記事】
DebianやFedoraでsudoコマンドを使う

Sponsored Link


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です