我的最終目標是創建一個腳本,可以在不使用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'
這個缺失變量的原因是什麼,我該如何避免它消失?或者,有沒有更好的方法來做到這一點,不會導致問題?
相信超級用戶環境與正常不同。糾正我,如果我錯了? –
將「PYTHONPATH」添加到os.environ會發生什麼? – Tamar
@Coldspeed超級用戶環境確實不同,是的,這就是爲什麼我想用用戶的os.environ替換它。 – Esker