从PHP脚本执行一个Bash脚本

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

我的client.php脚本看起来像

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

我的testscript看起来像

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

当我在terminal上做以下事情

 php client.php 

我在terminal上得到以下输出

 Testscript run successful 

但是,当我打开页面

 http://serverdomain/client.php 

我得到以下输出

 sh: /home/testuser/testscript: Permission denied 

即使在执行了chmod + x testscript之后,我仍然得到这个错误。
我怎样才能从浏览器中工作? 请帮忙。

我将在WWW文件夹下有一个名为脚本的目录,这样它就无法从networking访问,但是可以通过PHP访问。

例如/var/www/scripts/testscript

确保您的testscript的用户/组与您的testscript相同。 例如,如果你的client.php属于apache:apache ,用chown把bash脚本改成同一个用户/组。 您可以通过执行ls -al来了解您的client.php和web文件是什么。

然后运行

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

编辑:

如果你真的想要从一个Web服务器作为根运行一个文件,你可以尝试下面的二进制包装。 看看这个解决scheme,你想做同样的事情。

通过PHP执行根命令

没有真正知道设置的复杂性,我喜欢sudo路线。 首先,你必须configurationsudo以允许你的web服务器sudo以root身份运行给定的命令。 然后,你需要有脚本,Web服务器shell_exec(testscript)用sudo运行命令。

对于Apache和sudo的Debian框:

  1. configurationsudo:

    • 以超级用户身份运行以下命令以编辑sudo的新/专用configuration文件:

       visudo -f /etc/sudoers.d/Webserver 

      (或者你想在/etc/sudoers.d/调用你的文件)

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

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

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

      例如,假设我们总是要复制/ 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 )之前。 确保sudoconfiguration文件中指定的参数与此文件中的可执行文件使用的参数完全匹配。 所以,对于我们上面的例子,我们将在脚本中有以下内容:

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

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

记住:

在configurationsudo时,目标是允许命令以最受限制的forms出现。 例如,如果参数是/ root / test1 / root / test2 ,则不允许一般使用cp命令,而只允许cp命令。 这意味着cp的参数(和cp的function不能改变)。

这是一个简单的问题。 当你从terminal运行时,你正在从terminal运行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服务器组所有权。 下一个命令给组提供文件的可执行权限。 现在下一次你从浏览器开始,它应该可以工作。

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

这比运气好得多,但现在运作得很好。 我希望这有帮助。