2010-06-14 272 views
2

我正在Django(使用apache服務器)開發一個需要調用shell命令來啓用/解除一些守護進程的網頁。我嘗試用從Django運行shell命令

os.system(service httpd restart 1>$HOME/out 2>$HOME/error)

做出來,這個命令不會返回任何東西。任何想法如何解決這個問題?

回答

2

這裏是我的代碼使用從我的我的Django應用程序的一個啓動過程:

import subprocess 
    process = subprocess.Popen(['python', 'manage.py', 'some_command']) 

你的情況,那就是:你需要處理標準輸出

import subprocess  
process = subprocess.Popen(['service', 'httpd', 'restart']) 

(也和stderr - 不確定添加'1> $ HOME/out')是否適用於Popen。有doucmentation for subprocess

2

嘗試運行shell的命令:

import subprocess 
r = subprocess.call("service httpd restart 1>$HOME/out 2>$HOME/error", shell=True) 
+0

參數的正確拼寫是「shell」,而不是「Shell」。 – 2016-11-20 16:03:21

7

我會跳過部分,我強烈建議你大約有一個Web應用程序啓動和停止的系統進程的影響,並嘗試回答題。

您的django應用程序不應該與根用戶運行,應該可能需要啓動和停止服務。您可以通過可能解決這個問題:

  • 創建使用seteuid
  • 給予該文件中的設置uid屬性

該腳本會是這樣的

#!/usr/bin/python <- or wherever your python interpreter is 
import os 
os.seteuid(0) 
os.system("service httpd restart 1>$HOME/out 2>$HOME/error") 

要允許一個腳本將有效UID設置爲root(0),則必須以root身份在shell中運行:

chown root yourscript.py 
chmod u+s yourscript.py 
chmod a+x yourscript.py 

應該這樣做。在您的Django應用程序中,您現在可以調用os.system('yourscript.py')以root權限運行該命令。

最後,我相信您傳遞給os.system()的命令不是您要查找的內容,因爲您討論啓用和禁用守護進程,並且您正在執行的所有操作都是重新啓動apache ......似乎是你的django正在運行的地方,所以在實踐中你會殺死你自己的webapp。

+3

這對大多數用戶不起作用,因爲出於安全原因,seteuid操作不會在腳本中被允許。如果它確實有效,任何人都可以執行「python -c」import os; os.setuid(0); os.setgid(0); os.system(「sh」)'「來獲得root shell! – 2013-05-30 22:28:16