2017-06-15 86 views
0

我的最終目標是創建一個腳本,可以在不使用sudo的情況下由非特權用戶初始啓動,但會提示輸入sudo密碼並自行提升爲根。我一直在用bash包裝腳本來做這件事,但想要一些不需要額外文件的東西。使用os.execlpe以root用戶身份重啓腳本時丟失了PYTHONPATH變量

一些使用Google搜索this question on StackOverflow其中接受的答案建議使用os.execlpe重新啓動腳本,同時保留相同的環境。我試過了,但是它立即無法在第二次運行時導入非內置模塊。

調查顯示,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

將「PYTHONPATH」添加到os.environ會發生什麼? – 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

相關問題