2017-06-15 7 views
0

私の最終目標は、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' 

この欠落している変数の原因は何でしょうか。それをどうやって消滅させることができますか?あるいは、これを実行して問題にぶつからない良い方法がありますか?

+0

環境を継承する場合、私はスーパーユーザ環境が通常と異なって信じています。私が間違っていれば私を正す? –

+0

os.environに "PYTHONPATH"を追加するとどうなりますか? – Tamar

+0

@Coldspeedスーパーユーザーの環境は異なります。そのため、私はユーザーのos.environに置き換えたいと思っています。 – Esker

答えて

0

あなたは、スクリプトの引数として環境を、引数の代わりにexeclpeに渡しています。代わりにこれを試してみてください:

args = ['sudo', sys,executable] + sys.argv + [os.environ] 
os.execvpe('sudo', args, os.environ) 

あなたはちょうどあなたがすることができさえ

os.execvp('sudo', args) 
+0

私はそれを与えました(argsの終わりからos.environを取り除いた後)問題はまだ発生しています。 環境全体が新しいプロセスに渡されているわけではありません(そのほとんどはPYTHONPATH変数ではありません)。 – Esker

関連する問題