私の最終目標は、sudoを使わずに特権を持たないユーザが最初に起動できるスクリプトを作成することですが、sudoのパスワードを要求し、ルート。私はbashラッパースクリプトを使ってこれを行ってきましたが、追加のファイルを必要としない何かを整頓したいと思っています。os.execlpeを使用してrootとしてスクリプトを再起動するとPYTHONPATH変数が失われる
一部のグーグルが見つかりましたthis question on StackOverflow os.execlpeを使用して、同じ環境を維持しながらスクリプトを再起動するように提案されています。私はそれを試しましたが、すぐに2回目の実行で非組み込みモジュールのインポートに失敗しました。
PYTHONPATH変数が持ち越されていないことが明らかになりました。ほとんどの環境変数は(PERL5LIBも欠けていますが、他にもいくつかありますが、私はそれらを使用していません。
私は問題を示して簡単に少しテストスクリプトを持っている:
#!/usr/bin/env python
import os
import sys
print(len(os.environ['PYTHONPATH']))
euid = os.geteuid()
if euid != 0:
print("Script not started as root. Running with sudo.")
args = ['sudo', sys,executable] + sys.argv + [os.environ]
os.execlpe('sudo', *args)
print("Success")
の予想される出力は次のようになります。
6548
Script not started as root. Running with sudo.
[sudo] password for esker:
6548
Success
しかし、その代わりに、私はKeyError例外を取得しています:
6548
Script not started as root. Running with sudo.
[sudo] password for esker:
Traceback (most recent call last):
File "/usr/home/esker/execlpe_test.py", line 5, in <module>
print(len(os.environ['PYTHONPATH']))
File "/vol/apps/python/2.7.6/lib/python2.7/UserDict.py", line 23, in __getitem__
raise KeyError(key)
KeyError: 'PYTHONPATH'
この欠落している変数の原因は何でしょうか。それをどうやって消滅させることができますか?あるいは、これを実行して問題にぶつからない良い方法がありますか?
環境を継承する場合、私はスーパーユーザ環境が通常と異なって信じています。私が間違っていれば私を正す? –
os.environに "PYTHONPATH"を追加するとどうなりますか? – Tamar
@Coldspeedスーパーユーザーの環境は異なります。そのため、私はユーザーのos.environに置き換えたいと思っています。 – Esker