2009-02-19 65 views
33

所以我試圖讓一個進程作爲超級用戶從一個使用子進程的python腳本中運行。在IPython的殼像從一個python腳本作爲超級用戶運行一個命令

proc = subprocess.Popen('sudo apach2ctl restart', 
         shell=True, stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

工作正常,但只要我堅持到腳本中我開始越來越:sudo: apach2ctl: command not found

我想這是由於sudo處理ubuntu環境的方式。 (我也嘗試sudo -E apche2ctl restartsudo env path=$PATH apache2ctl restart與無濟於事)

所以我的問題基本上是,如果我想運行apache2ctl restart有需要時,提示爲超級用戶密碼的用戶超級用戶,我應該怎麼去這樣做這個?我無意在腳本中存儲密碼。

編輯:

我試圖通過在命令同時作爲字符串和記號化到一個列表。在python解釋器中,使用字符串我會正確得到密碼提示(仍然不能像在我原來的問題中一樣在python腳本中工作),列表只是給出了sudo的幫助屏幕。

編輯2:

所以我收集的是,雖然POPEN將一些命令,就像串工作時,殼=真,它需要

proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart']) 

沒有「殼=真」,以獲得須藤上班。

謝謝!

+2

這可能是一個安全風險如何配置sudo,以便該用戶可以運行這個命令而不需要密碼? – 2009-02-19 23:13:19

+0

您可能想使用[`proc.wait()`](https://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait),具體取決於您在做什麼; 「等待」不會繼續,直到子進程結束運行。 – craymichael 2016-11-08 19:58:34

回答

14

嘗試給出apache2ctl的完整路徑。

3

你必須使用POPEN這樣的:

cmd = ['sudo', 'apache2ctl', 'restart'] 
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

它需要一個列表。

+7

閱讀http://docs.python.org/library/subprocess.html當shell = True時,字符串和序列參數之間存在差異。 – jfs 2009-02-19 22:43:21

21

嘗試:

subprocess.call(['sudo', 'apach2ctl', 'restart'])

子進程需要訪問真正的標準輸入/輸出/ ERR它能夠提示你,並在你的密碼讀取。如果將它們設置爲管道,則需要將密碼自己填入管道中。

如果不定義它們,然後將其抓住sys.stdout的,等等

7

另一種方式是讓你的用戶密碼的sudo user

類型上以下命令行:

sudo visudo 

然後與你添加以下並更換<username>

<username> ALL=(ALL) NOPASSWD: ALL 

這將允許用戶執行sudo命令,而不必要求密碼(包括由所述用戶發起的應用程序。雖然

相關問題