26

我想从 PHP 脚本执行系统上存在的 Bash 脚本。我在系统上有两个脚本。其中一个是名为 present at 的 PHP 脚本client.php,另一个是名为present at/var/www/html的 Bash 脚本。testscript/home/testuser

我的 client.php 脚本看起来像

<?php
  $message=shell_exec("/home/testuser/testscript 2>&1");
  print_r($message);
?>  

我的测试脚本看起来像

#!/bin/bash
echo "Testscript run succesful"

当我在终端上执行以下操作时

php client.php

我在终端上得到以下输出

Testscript run successful

但是当我打开页面时

http://serverdomain/client.php

我得到以下输出

sh: /home/testuser/testscript: Permission denied 

即使在我执行 chmod +x testscript 之后,我也会收到此错误。
如何让它从浏览器工作?请帮忙。

4

4 回答 4

18

我会在 WWW 文件夹下的某个地方有一个名为 scripts 的目录,这样它就无法从 Web 访问,但可以通过 PHP 访问。

例如/var/www/scripts/testscript

确保您的用户/组与您testscript的网络文件相同。例如,如果您client.php的所有者是apache:apache,则使用 将 bash 脚本更改为相同的用户/组chown。您可以client.php通过ls -al.

然后运行

<?php
      $message=shell_exec("/var/www/scripts/testscript 2>&1");
      print_r($message);
    ?>  

编辑:

如果你真的想从网络服务器以 root 身份运行文件,你可以试试下面的这个二进制包装器。查看此解决方案,了解您想要做的同样事情。

通过 PHP 执行 root 命令

于 2013-06-17T16:13:55.567 回答
5

在不知道设置的复杂性的情况下,我喜欢 sudo 路线。首先,您必须配置 sudo 以允许您的网络服务器 sudo 以 root 身份运行给定的命令。然后,您需要让网络服务器 shell_exec(testscript) 使用 sudo 运行命令的脚本。

对于带有 Apache 和 sudo 的 Debian 机器:

  1. 配置须藤:

    • 以 root 身份运行以下命令来编辑 sudo 的新/专用配置文件:

      visudo -f /etc/sudoers.d/Webserver
      

      (或任何您想在其中调用文件的内容/etc/sudoers.d/

    • 将以下内容添加到文件中:

      www-data ALL = (root) NOPASSWD: <executable_file_path>
      

      <executable_file_path>您需要能够以 root 身份运行并在其名称中包含完整路径的命令在哪里(/bin/chown例如chown可执行文件)。如果可执行文件每次都使用相同的参数运行,您可以在可执行文件的名称之后添加其参数以进一步限制其使用。

      例如,假设我们总是想复制 /root/ 目录中的同一个文件,我们将编写以下内容:

      www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2
      
  2. 修改脚本(testscript):

    编辑您的脚本,使其sudo出现在需要 root 权限的命令之前(例如sudo /bin/chown ...sudo /bin/cp /root/test1 /root/test2)。确保 sudo 配置文件中指定的参数与此文件中的可执行文件使用的参数完全匹配。因此,对于我们上面的示例,我们将在脚本中包含以下内容:

    sudo /bin/cp /root/test1 /root/test2
    

如果您仍然获得权限被拒绝,则脚本文件及其父目录的权限可能不允许网络服务器执行脚本本身。因此,您需要将脚本移动到更合适的目录和/或更改脚本和父目录的权限以允许 www-data(用户或组)执行,这超出了本教程的范围。

记住:

配置 sudo 时,目标是允许以最受限制的形式执行命令。例如,如果参数是/root/test1 /root/test2,则只允许使用cp命令,而不是允许一般使用cp命令。这意味着cp的参数(和 cp 的功能不能更改)。

于 2013-06-18T08:41:16.307 回答
3

我在这个确切的问题上苦苦挣扎了三天。我已将脚本的权限设置为 755。我一直在调用我的脚本,如下所示。

<?php
   $outcome = shell_exec('/tmp/clearUp.sh');
   echo $outcome;
?>

我的脚本如下。

#!bin/bash
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;

我没有得到任何输出或反馈。我为使脚本运行所做的更改是在脚本内添加一个 cd 到 tmp :

#!bin/bash
cd /tmp;
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;

这更多是靠运气而不是判断,但它现在运行良好。我希望这有帮助。

于 2014-07-17T11:15:28.313 回答
2

这是一个简单的问题。当您从终端运行时,您是以特权用户身份从终端运行 php 文件。当您从 Web 浏览器访问 php 时,php 脚本正在以 Web 服务器用户身份运行,该用户无权执行主目录中的文件。在 Ubuntu 中,www-data 用户是 apache Web 服务器用户。如果您在 ubuntu 上,则必须执行以下操作: chown yourusername:www-data /home/testuser/testscript chmod g+x /home/testuser/testscript

上面所做的是将文件的用户所有权转移给您,并赋予网络服务器组对其的所有权。下一条命令赋予组对该文件的可执行权限。现在,下次您继续从浏览器执行此操作时,它应该可以工作。

于 2013-06-17T17:36:58.617 回答