web-dev-qa-db-ja.com

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

Solaris 5.10でSudo 1.7.4p 4を、RHEL 4 u6でSudo 1.6.7p 5を使用する私の環境変数を保存する方法がわかりません、例えば$ PYTHONPATH。この行をsudoersに追加しましたが、違いはありません。

Defaults !env_reset

私は何か悪いことをしていますか、それともSudoのインストールは単にenv_resetフラグを尊重していませんか?

編集:少なくともSolaris上で、我々はこの問題がシェルに依存していることを発見しました!標準ルートシェルはBourneです。一方、Sudo(Sudo bash)の下でbashを実行すると、!env_presetは環境(PATHとLD_LIBRARY_PATHを含む)を保持します。これは私が言わなければならないやや複雑な行動です。

47
aknuds1

慎重に使用すると、Sudoと変数にはセキュリティ上の問題があります。

man sudoersから私はあなたが使用するべきであることがわかりました

デフォルトenv_reset 
デフォルトenv_keep + = "PYTHONPATH OTHERVARIABLE YETANOTHER" 

Ubuntuでは、Sudoはいくつかの変数を保存します。 Sudo -iは、rootとしてログインしてからコマンドを実行するのに似ています。どちらも不便かもしれません、Sudo nano myfileの前者はあなたの家の中にroot所有のファイルを残し、Sudo -i nano myfileのための後者は/ root/myfileを開こうとします。


実行する

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

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

図書館について:

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

LinuxディストリビューションはPATHには細心の注意を払っていますので、実際にプレーする前に注意してください。 "."や/home/usernameのようなパスを追加することには特に注意してください。安全ではありません。

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

44
user39559

他の人が言っているように、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'
8
Russ

Defaults !env_resetオプションを指定してSudoを呼び出していないと仮定すると、-Eは問題ないようです。

そのエントリを完全に削除してみてください。

正しいsudoersファイルを編集していることを確認しましたか?インストール方法に応じて、/etc/sudoersまたは/usr/local/etc/sudoersになる可能性があります。 visudoを使って編集しましたか?

あなたはどのようにsudoを動かしていますか? Sudo pythonSudo suSudo su -Sudo -s、他に何か?環境を保護するのはSudo pythonSudo suだけです。

env | grep PYTHONPATHは何と言っていますか?何もない場合は、export PYTHONPATHを実行してPYTHONPATHがエクスポートされていることを確認してから、やり直してください。

Sudo env | grep PYTHONPATHは何と言っていますか?期待値が表示された場合は、PYTHONPATH値が他のものによって上書きされています。 rootの.bashrcや.bash_profile、あるいはシステム全体の設定ファイルかもしれません。

3
Mikel