【问题标题】:Why cannot PHP execute a command from web browser?为什么 PHP 不能从 Web 浏览器执行命令?
【发布时间】:2013-02-22 00:05:45
【问题描述】:

这真的很简单,但我根本无法让它工作。花了很多时间,我总是放弃。我创建了名为 copy.php 的 php 脚本,它应该调用一个名为 copy.py 的 python 脚本。

我想执行这样的命令行

 <?php exec('/var/www/html/copy.py'); ?>

真的很简单。

为什么我不能从 php exec() 获取 python 脚本? python 脚本中的功能是从不同的目录(Apache 外部)获取 error_log 的副本到 html 目录中。

如果我从终端运行它

 > php copy.php

它确实执行了该功能并制作了一个副本。为什么网络浏览器不这样做?

让我简化一下:

为什么不能 exec("cp /var/log/httpd/error_log /var/www/html/path/to/php/script") 工作?

如果我在终端中输入它可以正常工作,但在浏览器中运行时就不行。

【问题讨论】:

  • 用户权限问题
  • Dagon 暗示的是,当您在命令行上运行该页面时,它正在您的用户名下运行。所以php拥有的权限和你一样。如果你可以运行脚本,php 可以。当从 apache 调用时,php 在 apache 用户(通常是“apache”)下运行。用户 apache 必须具有 exec 运行 python 脚本的执行权限,并且很可能具有访问 python 脚本试图访问的任何内容的权限。还有,我不知道python脚本是做什么的,但是如果只是copy的话,php有copy的功能。
  • 我回显了“whoami”,它说的是 Apache,但没有意义的是我使用 exec("python /usr/diskpurge/script.py") 执行 python 脚本在 Apache 目录之外,我的一个 php 脚本也没有问题,它也将“Apache”回显为 whoami。并且没有 php 错误或任何东西。

标签: php apache exec


【解决方案1】:

正如其他人所暗示的那样,区别可能在于权限。当您从命令行运行命令时,您通常与运行 apache 脚本的用户不同。

换句话说,如果您在命令行中输入whoami,您可能会得到您的用户帐户的任何名称。

php 中的echo exec('whoami'); 显示了脚本的运行身份,即 Apache。

因此,您尝试从 Web 服务器运行的任何命令都不能以 Apache 用户身份运行。你提到你可以让exec("python /usr/diskpurge/script.py") 工作,但不能让exec('/var/www/html/copy.py') 工作。这是由于在一种情况下您正在运行 python,而在另一种情况下您正在尝试执行 copy.py 脚本。如果 copy.py 没有 Apache 用户的执行权限,您将无法从浏览器运行它。

【讨论】:

    【解决方案2】:

    也许不同的设置适用于 Apache 环境和命令行。

    使用error_reporting(E_ALL);ini_set('display_errors', true) 查看可能出现的错误。

    有可能是 Apache 环境被禁止使用 exec,或者 Apache 在没有 Python 脚本的 execute 权限的不同用户下运行。

    【讨论】:

    • 没有任何错误。我的一个 php 脚本在 apache 之外执行 python 脚本没有问题,即使它作为 Apache 运行
    【解决方案3】:

    听起来像是权限错误。检查您的服务器是否以足够的权限运行。

    echo exec('whoami');

    将您的错误报告设置为报告所有:

    ini_set('display_errors', true);
    error_reporting(E_ALL);
    

    并检查错误..

    如果您的 whoami 返回的用户不是 SU 系列 (linux) 或管理 (windows) 的成员,则重新设置您的权限..

    Linux: 为 whoami 返回的用户分配正确的权限以运行 python 脚本。不要让生成的用户名以具有全部管理权限的 root 身份运行。这是一个很大的禁忌

    【讨论】:

      【解决方案4】:

      它不工作的唯一原因是你没有设置写权限!

      做:

      sudo nano /etc/sudoers 
      

      然后输入以下内容:

      www-data ALL=(root) NOPASSWD:ALL
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2020-08-17
        • 2011-06-06
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多