2012-10-28 107 views
0

可能重复:
How to call shell script from php that requires SUDO?通过PHP exec运行SUDO?

我有需要SU权(Ubuntu的服务器)上运行Python文件。
无法弄清楚如何去做。

从PHP运行它像这样:

$command = "python /path/to/my/file.py params"; 
$temp = exec($command, $output); 
var_dump($output); 

不工作。 (Xvfb来无法启动非root)

尝试:

$command = "echo 'root_pwd' | sudo -S python /program.py params" 
... 

没有工作。

尝试:编辑/ etc/sudoers文件:

Cmnd_Alias BUNDLE = /path/to/myprog.py 
nobody ALL=(ALL) NOPASSWD:BUNDLE 

然后:

$command = "sudo -u nobody python myprog.py params"; 
... 

没有工作。
当我说“没有工作” - 我的意思是var_dump($ output)返回空数组,服务器上没有成功的结果(myprog.py应该在服务器上生成一个文件),或者页面只需加载几分钟直到它超时。

基本的.py文件(不需要特殊权限)工作。

请帮忙。

PS: .Py文件制作URL的截图,所以使用webkitgtk,Xvfb和其他一些东西。

+1

许多(大多数?)sudo的配置包括了'requiretty'指令,它防止'被称为sudo'通过非用户终端进程。您可能在运行时禁用了'requiretty',但我强烈建议您咨询serverfault.com以获得正确的设置。你可能会严重损害你的系统的安全性...... –

回答

0

你的命令是黄:

$command = "sudo -u nobody python myprog.py params"; 

在这里,我们直接调用Python解释器,但在你的sudores文件,你只允许/path/to/myprog.py

如果你想这样做,这样,然后添加一个认领你的Python程序,并使其可执行文件,然后改变你的命令

$command = "sudo -u nobody /path/to/myprog.py params"; 

但是这个工作,用户您在指定sudoers文件必须是执行该命令的用户,可能不是nobody,而是web服务器进程(www-data?):

Cmnd_Alias BUNDLE = /path/to/myprog.py 
www-data ALL=(ALL) NOPASSWD:BUNDLE 

另一种方法你试过

$command = "echo 'root_pwd' | sudo -S python /program.py" 

可能失败的原因有两个:

  • 当前用户(可能是Web服务器程序)是不允许的sudo
  • sudo不占用root密码,但当前用户的密码

而且你并不真的想通过密码这样反正...