2010-06-14 228 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