sudoで環境変数を保存するにはどうすればいいですか?

environment-variables redhat-enterprise-linux solaris-10 sudo

Solaris 5.10ではsudo 1.7.4p4、RHEL4 u6ではsudo 1.6.7p5を使用していますが、環境変数、例えば$PYTHONPATHを保存する方法がわかりません。sudoersにこの行を追加してみましたが、何の違いもありません

Defaults !env_reset

私は何か間違ったことをしているのでしょうか、それとも単に sudo のインストールが env_reset フラグを尊重していないだけなのでしょうか?

編集: 少なくともSolarisでは、この問題はシェルに依存していることがわかりました。標準の root シェルは Bourne で、一方で sudo (sudo bash) で bash を実行すると、 !env_preset は環境 (PATH と LD_LIBRARY_PATH を含む) を保持します。これはかなり紛らわしい挙動だと言わざるを得ません

  48  aknuds1  2011-01-12


ベストアンサー

sudoや変数にはセキュリティ上の問題があるので注意して使ってください

man sudoersから、使った方がいいことがわかりました

Defaults        env_reset
Defaults        env_keep += "PYTHONPATH OTHERVARIABLE YETANOTHER"

Ubuntuでは、sudoはいくつかの変数を保持します。sudo -i は root でログインしてコマンドを実行するようなものです。どちらも不便かもしれませんが、前者のsudo nano myfileはルート所有のファイルをホーム内に残し、後者のsudo -i nano myfileは/root/myfileを開こうとします


Run

sudo printenv PATH

何を与えてくれるのか見てみましょう。ここでは、それが与える

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

のようにしてください。では、sudo visudoを実行して行を追加します

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

を先ほど見つけたものに置き換えてください。必要に応じて新しいパスを追加してください

About libraries:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Linux ディストリビューションでは PATH に注意を払っているので、遊ぶ前には本当に注意が必要です。./home/usernameのようなパスの追加には特に注意が必要です

パスを追加することの危険性の一つは、これらのパス上のファイルがrootによって実行される可能性があり、悪意のあるソフトウェアによって悪用される可能性のあるシステムセキュリティの窓を開くことです。他にも危険があるかもしれません。自分が何をしているのかを確認してください。sudo セキュリティ対策をバイパスすることで、Solaris が Windows XP と同じように安全になるかもしれません

45  user39559  2011-01-12


sudoersをいじることは、他の人が言っているように、注意して行う必要があります

保存したい特定の環境変数がある場合のよりシンプルなアプローチは、sudo を通して直接環境変数を渡すことです (これは sudo cmdline のヘルプでは [VAR=value] と表示されています)

この小さな例では、私も複数の変数のためにそれを実証しています

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

問題の元になっているPYTHONPATHの例であれば、以下のようにすればいいだけです

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

この手のエイリアスを作っておくと便利です。こんな感じで

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'

8  Russ  2012-05-10


Defaults !env_reset は、-E オプションをつけて sudo を呼んでいなければ問題ないように見えます

そのエントリーを完全に削除してみてはいかがでしょうか

正しいsudoersファイルを編集しているか確認しましたか?インストールの仕方によっては/etc/sudoers/usr/local/etc/sudoersになっているのではないでしょうか?visudoで編集しましたか?

sudoをどのように実行していますか?sudo python, sudo su, sudo su -, sudo -s, 他に何か?sudo pythonsudo suだけで環境が保たれます

env | grep PYTHONPATHは何と言っているのでしょうか?何もなければ、export PYTHONPATHを実行してPYTHONPATHがエクスポートされていることを確認して、もう一度やってみてください

sudo env | grep PYTHONPATHは何と言っているのでしょうか?期待された値を表示しているのであれば、他の何かが PYTHONPATH の値を上書きしていることになります。ルートの .bashrc や .bash_profile、システム全体の設定ファイルなどが考えられます

3  Mikel  2011-01-12


LD_LIBRARY_PATHのUbuntuドキュメントによると、以下のようになっています

設定ファイルは/etc/ld.so.conf.d/*.confを使用する必要があります

Then:

  1. ld.soの設定ファイルを/etc/ld.so.conf.d/LD_LIBRARY_PATHのパスで追加します

  2. でキャッシュを更新します

    sudo ldconfig -v
    

-1  OlPo  2016-06-02


タイトルとURLをコピーしました