Python 从Django运行shell命令

Python 从Django运行shell命令,python,django,apache,Python,Django,Apache,我正在Django中开发一个网页(使用apache服务器),需要调用shell命令来启用/禁用一些守护进程。我正试着和你一起做这件事 os.system(服务httpd重启1>$HOME/out 2>$HOME/error) 这个命令不会返回任何内容。知道如何解决这个问题吗?以下是我从django应用程序启动流程时使用的代码: import subprocess process = subprocess.Popen(['python', 'manage.py', 'some_comman

我正在Django中开发一个网页(使用apache服务器),需要调用shell命令来启用/禁用一些守护进程。我正试着和你一起做这件事

os.system(服务httpd重启1>$HOME/out 2>$HOME/error)


这个命令不会返回任何内容。知道如何解决这个问题吗?

以下是我从django应用程序启动流程时使用的代码:

  import subprocess
  process = subprocess.Popen(['python', 'manage.py', 'some_command'])
在您的情况下,它将是:

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

(您还需要处理stdout和stderr-不确定是否添加'1>$HOME/out')可以与Popen一起使用。有

请尝试在Shell中运行命令:

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

我将跳过我强烈建议您web应用程序启动和停止系统进程的含义的部分,并尝试回答这个问题

django应用程序不应与root用户一起运行,启动和停止服务可能需要root用户。您可能可以通过以下方式克服此问题:

  • 创建使用
  • 为该文件指定set-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")
应该这样做。在Django应用程序中,您现在可以调用
os.system('yourscript.py')
以root权限运行该命令


最后,我相信您传递给
os.system()
的命令不是您想要的,因为您谈论的是启用和禁用守护进程,而您所做的只是重新启动apache。。。而这又似乎是django运行的地方,因此在实践中,您将杀死自己的Web应用程序。

这对大多数用户不起作用,因为出于安全原因,脚本中不允许seteuid操作。如果它真的起作用,任何人都可以通过“python-c”导入os;os.setuid(0);os.setgid(0);os.system(“sh”)”来获得一个根shell!参数的正确拼写是“shell”,而不是“shell”。为什么要使用
子流程
而不是内置的Django
调用_命令
方法来运行
/manage.py some_命令
?请参见此处的完整建议解决方案:
chown root yourscript.py
chmod u+s yourscript.py
chmod a+x yourscript.py