2009-02-19 83 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命令,而不必要求密码(包括由所述用户发起的应用程序。虽然

相关问题