从PHP脚本执行shell脚本

从PHP脚本执行shell脚本,php,apache,bash,shell,permission-denied,Php,Apache,Bash,Shell,Permission Denied,我想从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); ?> 当我在终端上执行以下操作时 p

我想从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);
?>  
当我在终端上执行以下操作时

php client.php
Testscript run successful
我在终端上得到以下输出

php client.php
Testscript run successful
但是当我在

http://serverdomain/client.php
我得到以下输出

sh: /home/testuser/testscript: Permission denied 
即使在执行chmod+x testscript之后,我也会出现此错误。

如何从浏览器中使其工作?请帮助。

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

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

确保
testscript
的用户/组与Web文件相同。例如,如果您的
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服务器以root用户身份运行文件,可以尝试下面的二进制包装器。检查此解决方案,了解您想要做的事情


这是一个简单的问题。当您从终端运行时,您是作为特权用户从终端运行php文件。当您从web浏览器转到php时,php脚本将作为web服务器用户运行,该用户没有权限执行主目录中的文件。在Ubuntu中,www数据用户是apache web服务器用户。如果您使用的是ubuntu,则必须执行以下操作: chown yourusername:www-data/home/testuser/testscript chmod g+x/home/testuser/testscript


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

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

对于使用Apache和sudo的Debian box:

  • 配置sudo:

    • 作为root用户,运行以下命令编辑sudo的新/专用配置文件:

      visudo -f /etc/sudoers.d/Webserver
      
      (或者在
      /etc/sudoers.d/
      中调用文件的任何内容)

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

      www-data ALL = (root) NOPASSWD: <executable_file_path>
      
  • 修改脚本(testscript):

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

    sudo /bin/cp /root/test1 /root/test2
    
    #!bin/bash
    cd /tmp;
    find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;
    
  • 如果您的权限仍然被拒绝,则脚本文件及其父目录的权限可能不允许Web服务器执行脚本本身。 因此,您需要将脚本移动到更合适的目录和/或更改脚本和父目录的权限,以允许www数据(用户或组)执行,这超出了本教程的范围

    记住:


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

    我为这个问题苦苦挣扎了三天。我已将脚本的权限设置为755。我一直在按如下方式调用我的脚本

    <?php
       $outcome = shell_exec('/tmp/clearUp.sh');
       echo $outcome;
    ?>
    
    我没有得到任何输出或反馈。为了让脚本运行,我所做的更改是在脚本内的tmp中添加一张cd:

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

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

    阅读权限如何<没有
    read
    权限,code>Execute权限无效。Apache将无权访问您的主目录。你也不应该真的想要它。请记住,仅授予脚本权限是不够的。您还必须授予对其所在目录的访问权限。e、 g.如果我把一个“免费的,拿一个”的报纸夹放在银行金库里,没有人可以拿这些报纸,即使它们是免费的。@MarcB我忘记了路径的权限。这是一个很好的类比。您需要在该脚本上为您的Web服务器授予
    sudo
    权限。或者将脚本包装在suid二进制文件中。但不管怎样,都要非常小心。错误地调用脚本,错误地传递一些数据,您在服务器上为远程用户提供了一个根shell,服务器就会崩溃。这被称为坏主意。:)就是不要这样做。真正的安全风险。由于Web服务器不(或不应该)以root用户身份运行,它将无法这样做。我用信息更新了我的答案,以找到适合您的解决方案。节省我写出来的时间。:)我希望我的testscript仅位于/home/testuser。我想用php来执行它。我如何做到这一点,而不必改变我的测试脚本,也不必牺牲安全性。我只是想要它,因为这个脚本对我不起作用,如果我以
    www-data
    的形式执行它,我的脚本就不会有任何输出,但是如果使用
    root
    执行它,它就会起作用。我在RHEL上。对我来说,web服务器用户应该是apache。阿尔索