因此,我正在尝试使用子进程从python脚本中以超级用户身份运行进程.在ipython shell中就像是
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 restart
和sudo env path=$PATH apache2ctl restart
与无济于事)
所以我的问题基本上是,如果我想以apache2ctl restart
超级用户身份运行,在需要时提示用户输入超级用户密码,我应该怎么做呢?我无意在脚本中存储密码.
编辑:
我已经尝试将命令作为字符串传递并标记为列表.在python解释器中,使用字符串我将正确地获得密码提示(仍然不像我原来的问题那样在python脚本中工作),列表只是给出了sudo的帮助屏幕.
编辑2:
所以我收集的是,当shell = True时,Popen将使用一些命令作为字符串,这需要
proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])
没有'shell = True'让sudo工作.
谢谢!
尝试:
subprocess.call(['sudo', 'apach2ctl', 'restart'])
子进程需要访问真正的stdin/out/err才能提示您,并读入您的密码.如果将它们设置为管道,则需要自己将密码提供给该管道.
如果你没有定义它们,那么它会抓取sys.stdout等...
尝试给出apache2ctl的完整路径.
另一种方法是让您的用户无密码sudo user
.
在命令行上键入以下内容:
sudo visudo
然后添加以下内容并替换为
您的:
ALL=(ALL) NOPASSWD: ALL
这将允许用户执行sudo
命令而不必询问密码(包括由所述用户启动的应用程序.这可能是安全风险,尽管
您必须像这样使用Popen:
cmd = ['sudo', 'apache2ctl', 'restart'] proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
它期望一个列表。