从PHP脚本执行shell脚本

nma*_*hok 25 php apache bash shell permission-denied

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

我的client.php脚本看起来像

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

我的测试文件看起来像

#!/bin/bash
echo "Testscript run succesful"
Run Code Online (Sandbox Code Playgroud)

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

php client.php
Run Code Online (Sandbox Code Playgroud)

我在终端上得到以下输出

Testscript run successful
Run Code Online (Sandbox Code Playgroud)

但是当我打开页面时

http://serverdomain/client.php
Run Code Online (Sandbox Code Playgroud)

我得到以下输出

sh: /home/testuser/testscript: Permission denied 
Run Code Online (Sandbox Code Playgroud)

即使我做了chmod + x testscript后,我也收到了这个错误.
如何从浏览器中使用它?请帮忙.

Pan*_*ack 15

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

例如 /var/www/scripts/testscript

确保您的用户/组与您testscript的网站文件相同.例如,如果您client.php拥有apache:apache,请将bash脚本更改为使用相同的用户/组chown.您可以client.php通过执行操作找出您和Web文件的所有权ls -al.

然后跑

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

编辑:

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

通过PHP执行root命令


小智 5

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

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

  1. 配置sudo:

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

      visudo -f /etc/sudoers.d/Webserver
      
      Run Code Online (Sandbox Code Playgroud)

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

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

      www-data ALL = (root) NOPASSWD: <executable_file_path>
      
      Run Code Online (Sandbox Code Playgroud)

      这里<executable_file_path>是你必须能够以root身份在其名称的完整路径运行命令(假设/bin/chownCHOWN可执行文件)。如果可执行文件每次都使用相同的参数运行,您可以在可执行文件的名称后立即添加其参数以进一步限制其使用。

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

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

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

    sudo /bin/cp /root/test1 /root/test2
    
    Run Code Online (Sandbox Code Playgroud)

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

记住:

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