从PHP脚本执行shell脚本

时间:2013-06-17 16:03:12

标签: php apache bash shell permission-denied

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

我的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 个答案:

答案 0 :(得分:14)

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

e.g。 /var/www/scripts/testscript

确保testscript的用户/群组与您的网页文件相同。例如,如果client.phpapache:apache所有,请使用chown将bash脚本更改为同一用户/组。您可以通过执行client.php来了解您的ls -al和网络文件的所有权。

然后运行

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

修改

如果您真的想从网络服务器以root身份运行文件,可以尝试下面的二进制包装器。查看此解决方案,了解您要执行的相同操作。

Execute root commands via PHP

答案 1 :(得分:4)

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

对于Apache和sudo的Debian框:

  1. 配置sudo:

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

      visudo -f /etc/sudoers.d/Webserver
      

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

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

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

      其中<executable_file_path>是您需要能够以root身份运行并且名称中包含完整路径的命令(例如,对于 chown 可执行文件,请/bin/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
    
  3. 如果您仍然被拒绝权限,则脚本文件及其父目录的权限可能不允许Web服务器自己执行脚本。 因此,您需要将脚本移动到更合适的目录和/或更改脚本和父目录的权限以允许通过www-data(用户或组)执行,这超出了本教程的范围。

    请记住:

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

答案 2 :(得分: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

以上操作是将文件的用户所有权转移给您,并为其提供Web服务器组的所有权。 next命令为组提供文件的可执行权限。现在,下次你继续从浏览器中执行它,它应该可以工作。

答案 3 :(得分:2)

我在这个问题上苦苦挣扎了三天。我已将脚本的权限设置为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 {} \;

这更多的是运气而不是判断,但它现在运作得很好。我希望这会有所帮助。