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


47

Solaris 5.10でsudo 1.7.4p4を使用し、RHEL4 u6でsudo 1.6.7p5を使用すると、$ PYTHONPATHなどの環境変数を保持する方法がわかりません。この行をsudoersに追加しましたが、違いはありません。

Defaults !env_reset

私は何か間違っているのですか、sudoのインストールは単にenv_resetフラグを尊重していませんか?

編集:少なくともSolarisでは、この問題はシェルに依存していることがわかりました!標準のルートシェルはBourne sudo bashです。一方、sudo()でbashを実行すると、!env_presetは環境(PATHおよびLD_LIBRARY_PATHを含む)を保持します。これは私が言わなければならないかなり混乱した振る舞いです。


回答:


44

慎重に使用してください。sudoと変数にはセキュリティ上の問題があります。

man sudoers私はあなたが使用する必要があることがわかりました

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

Ubuntuでは、sudoいくつかの変数を保持します。sudo -iルートとしてログインしてからコマンドを実行するようなものです。両方とも不便かもしれません。前者sudo nano myfileはルート所有のファイルを家の中に残し、後者は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と同じくらい安全になります。


提案をありがとう。少なくともSolarisでは、env_keepはPATHとLD_LIBRARY_PATHを無視するため、一部しか機能しないようです。sudoは「危険な」変数の保存を拒否する設定で構築されているのでしょうか?
aknuds1

AKNUDSのような別の変数で動作しましたか?sudo sudo -V(はい、2回sudo!)を実行して、その内容を確認することもできます。ここで、上記のソリューションはPYTHONPATHで正常に機能しますが、PATHは本当に特別なようです。本当の問題はPATHにあります。Ubuntuでは、sudoを意図的にリセットしてPATHをリセットします。
user39559

env_keepはPYTHONPATHとHOMEを保存してくれたので、明らかにいくつかのフィルタリングが行われています。
aknuds1

修正されたソリューションでは、secure_pathを変更してsudo PATHをハードワイヤすることを提案していますか?私はそれをしたいとは思わない。ただし、おそらく私の質問への回答に近いでしょう。sudoは、env_keepで指定された場合、reset_envを無視し、PATHやLD_LIBRARY_PATHなどの変数を無視するように構築されていると思います。PATH / LD_LIBRARY_PATHをsudoで保存せずにできると思いますが、大したことではありませんが、なぜそれが機能しないのかを知るのは面白いです:)
aknuds1

sudo作家はあなたがそれをするのを防ぐことに注意していたので、それは機能しません。悪意のあるライブラリは、sudoが使用するパスで見つかったため、ロードされたくないでしょう。そのため、リセットされます。ルートで実行することを意図しているものをコーディングしている場合は、それらを適切なシステムディレクトリにコピーします。
-user39559

8

sudoers他の人が言ったように、いじるのは慎重に行われるべきです。

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

この小さな例を参照してください。複数の変数についても説明しました。

$ 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'

1
それを行うのが良いかもしれません-エイリアスsudopy = 'sudo PYTHONPATH = $ PYTHONPATH python'-それを使用してsudopy some_script.py
Able Mac

@AbleMacその通りです。それは間違いだった...私はそれを修正します。ありがとう!
ラス

3

あなたのDefaults !env_resetルックスのOK、あなたもでsudoを呼び出していないと仮定すると-Eオプション。

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

正しいsudoersファイルを編集していることを確認しましたか?私はそれができる推測している/etc/sudoersか、/usr/local/etc/sudoersそれがインストールされた方法に応じて。を使用して編集しましたvisudoか?

sudoをどのように実行していますか? sudo pythonsudo susudo su -sudo -s、他の何か?のみsudo pythonsudo su環境を守るでしょう。

何てenv | grep PYTHONPATH言うの?何もない場合は、実行してPYTHONPATHがエクスポートされていることを確認し、export PYTHONPATH再試行してください。

何てsudo env | grep PYTHONPATH言うの?期待される値を出力する場合、他の何かがPYTHONPATH値を上書きしています。たぶん、ルートの.bashrcまたは.bash_profileまたはシステム全体の構成ファイル。


1
sudoに対応するインストールプレフィックスを使用して、正しいsudoerを編集していると確信しています。sudoを「sudo su」として実行しています。残念ながら、数日後には、残りの提案に戻る必要があります。ありがとう!
aknuds1

1
などの重要でない設定を変更して、正しいファイルがあるかどうeditorpasspromptを確認してください。または、strace、dtrace、trussなどを使用して、開いているファイルを確認します。
ミケル

env | grep PYTHONPATHはユーザーが期待する値を出力するため、sudoの下では何も出力されません。sudoersを編集して、「env_keep」を変更することで、PYTHONPATHが保持されることを確認できます。ただし、env_keepはPATHまたはLD_LIBRARY_PATHを保持しません。sudoには、PATHやLD_LIBRARY_PATHなどの変数を保持しないというセキュリティ制限があると思いますか?おそらくビルド時の設定ですか?
aknuds1

1
!env_resetは、私が知る限り無視されますが、明日は再確認できます。env_deleteが設定されていないと確信していますが、それも確認できます。
aknuds1

1
!env_resetが無視され、env_deleteが設定されていないことを確認しました。
aknuds1

-1

LD_LIBRARY_PATHのUbuntuドキュメントによると:

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

次に:

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

  2. 次を使用してキャッシュを更新します。

    sudo ldconfig -v
    

いいですが、質問はUbuntuに関するものではありません。ヒント:次回は質問の下のタグを見てください。
DavidPostill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.