「sudo」で実行した場合の環境変数


48

私の質問の例として、私の~/.bashrcファイルには次の行が含まれています。

export LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH
export LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so

Numpy(Python)は、MKLおよびIntelコンパイラーでビルドされているため、実行する必要のあるライブラリーを見つけることができます。このワークフローは最適ではありませんが、それは別の話です。

私の質問は、「sudo」でプログラムを実行するときに(ルートではなく)任意の変数を渡すことができ~/.bashrcますか?

現在、私が実行した場合:

sudo python -c "import numpy"

エラーが発生します:

ImportError: libimf.so: cannot open shared object file: No such file or directory*

ここで何かを変更する、sudo -iまたはsudo -E変更しないいくつかの提案。


編集:

私は自分の質問に答えることはできません(十分なポイントはありません:D)が、ここでコメントしますsudo

[一時的にのみ!]これは私に有効です(~/.bashrc):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

回答:


57

環境変数はsudo、ENV = VALUEの形式で簡単に渡すことができ、後続のコマンドで受け入れられます。この使用法に制限があるかどうかはわかりませんので、私の問題例は次の方法で解決できます。

sudo LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so python -c "import numpy"


それでも今日は、RPi 3のRaspbian Jessyでこれが機能しました...ほぼ1週間後、私のスクリプトが起動時に実行されなかったのはなぜですか。どうもありがとう!
-DarkCygnus

21

-Eあなたが言及オプションがうまく動作するようです:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy

申し訳ありませんが、回答がわかりません。上記のシナリオの例を提供できますか?つまりは、実行できるようにするsudo python -c "import numpy"LD_LIBRARY_PATHし、LD_PRELOAD上に書いたように定義しますか?
ゼータ

2
@zetah:OK、私は間違っています、なぜならそれはジェネリック変数で動作しますが、マニュアルページのセクションSECURITY NOTESで述べられているように、動的リンク制御変数では動作しませんsudo
enzotib

それは(提供された答えのように)、man sudoそれは明確ではありませんが、ユーザーがそこに示された参照をたどろうとすると、推測する必要があるすべてのブランチに落胆するのは非常に簡単です意味。
ゼータ

14

-Esudoオプションを使用して、現在の環境を保持できます(実行する権限がある場合)

$ man sudo
 -E, --preserve-env
             Indicates to the security policy that the user wishes to preserve
             their existing environment variables.  The security policy may
             return an error if the user does not have permission to preserve
             the environment.

8

by オプションをオーバーライドするセキュリティポリシープラグインを有効にsudoerssudo visudoている可能性があるため、by を編集する必要があります。そのため、リストにパスを追加すると、代わりに次のように使用することもできます。PATHsecure_pathenv_keep

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

PATHがオーバーライドされているかどうかを確認するには、次のコマンドを実行します。

$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

参照:sudoとsuを介して実行する場合、なぜPATH変数が異なるのですか?Unix SEで


+1、ただしenv_keepPATHでは機能しません(コマンドを探すときにsudoまだ使用する意味でsecure_path
Zanna

0

これは私のために働きます(~/.bashrc):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

出典:OP編集による


1
これは動作しますが、それが動作してますので、それは悪い考えですsudo少ない安全
Zanna
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.