何を試しても、Sudoでコマンドを実行した後、LD_LIBRARY_PATH環境変数が保持されないようです。コマンドラインから呼び出す場合は、コマンドラインからSudo
コマンドの前に_LD_LIBRARY_PATH=/the/path
_を付けるだけですが、毎回これを実行する必要はありません。
Env_keepオプションはこの変数を無視しているようで、exempt_groupオプションも無視しています。
私の%groupは現在、sudoersでのアクセスとしてALL=(ALL) NOPASSWD:ALL
を持っています。この特定の環境変数を、実行するすべてのコマンドで保持してほしい。
これどうやってするの?
私のサーバーはRed Hat Enterprise Linux 5.7を実行しています。
あなたはこれを使ってこれを行うことができると期待するかもしれません
Defaults env_keep += "LD_LIBRARY_PATH FRED"
しかし、CentOS 6.2
を使用したSudo version 1.7.4p5
の簡単なテストでは、LD_LIBRARY_PATH
は渡されませんが、FRED
は渡されます。 sudoersのmanページには次のように書かれています
ほとんどのオペレーティングシステムのダイナミックリンカーは、 Sudoを含むsetuid実行可能ファイルの環境から 動的リンクを制御できる変数を削除することに注意してください。オペレーティングシステムによっては、これには_RLD、DYLD_、LD _、 LDR_、LIBPATH、SHLIB_PATHなどが含まれる場合があります。これらのタイプの変数は、Sudoが実行を開始する前に 環境から削除されるため、 Sudoがそれらを保持することはできません
したがって、Sudoが認識する前に、システムが環境からLD_LIBRARY_PATH
を削除しているように見えます。
これを機能させるために、私はこれをしなければなりませんでした:
Defaults env_keep += "LD_LIBRARY_PATH"
からsudoersalias Sudo='Sudo LD_LIBRARY_PATH=/mypath'
これで、Sudoで呼び出すコマンドには、変数が設定されます。
これは、LD_LIBRARY_PATHだけでなく、ビルド環境で調整される可能性のある他のいくつかの環境変数でも発生しています。私の場合、Sudoは次のようになりました。
Sudo -HE env PATH=${PATH} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} PYTHONPATH=${PYTHONPATH} my_command