2

我正在尝试在 PHP 中使用 exec(),当通过 Web 浏览器和命令行 shell 使用它时,我得到了不同的结果。

简单的事情:

<?php exec('mount 10.0.0.1:/mnt/test /home/user/test', $output) ?>

从 Web 浏览器调用它不会导致任何内容被挂载并通过命令行 (php-cli) 运行它会导致挂载成功执行。也没有错误返回到 $output 数组。所以我没有什么可以通过的。我以同一个用户的身份运行 web 和 cli,所以这不应该是权限问题。SElinux 被禁用,因此不会阻止任何内容。防火墙也是如此 - 也被禁用。

如何使 PHP exec() 在 Web 浏览器和命令行中的行为方式相同?

4

1 回答 1

0

您只能以 root 身份挂载分区,也许将 www-data(我假设那是运行 apache 的用户)添加到 sudoers 可以解决问题,但它会给您带来很大的安全漏洞。但是,由于它是一项服务,因此您无法编写密码,因此您必须告知不要向该用户询问密码。

将此添加到您的 sudoers 的底部:

www-data ALL=NOPASSWD: ALL

并将命令用作

<?php exec('sudo mount 10.0.0.1:/mnt/test /home/user/test', $output) ?>

显然,这是一个前所未有的安全漏洞。

避免它的一种方法可能是使用队列来放置作业并使用服务来处理它,该服务验证作业是否安全并在必要时安装。

一个不错的具有 php 接口的队列是beanstalk

于 2013-01-23T04:46:08.380 回答