PHP exec() 不工作 - 权限错误?

PHP exec() not working - permission error?

我正在尝试将 exec() 用于 运行 /var/www/litecoin/bin 中的程序和 echo 输出。

基本上是这样的: (来自 /var/www/html/index.php

<?php
   echo exec("../litecoin/bin/litecoin-cli getinfo");
?>

不过它只是显示一个空白页。

我知道这可能是一个权限错误,因为 运行ning ls 工作正常,但我不知道如何修复它。 (或者如果有更好的做事方式)

运行 直接通过终端的命令工作正常。 如果重要的话,我正在 PHP7.0 和 Ubuntu 16.04 上使用 Apache。

编辑

当我 运行 它在登录 www-data 时通过终端执行 php index.php 时它工作正常,但是当我在网络浏览器中打开它时它似乎没有执行/var/www/litecoin/bin/litecoin-cli 完全没有。

编辑 2

将错误从 stderr 重定向到 stdout (2>&1) 时,我得到以下信息:

[0] => 
[1] => 
[2] => ************************
[3] => EXCEPTION: N5boost10filesystem16filesystem_errorE
[4] => boost::filesystem::create_directory: Permission denied: "/.litecoin"
[5] => litecoin in AppInitRPC()
[6] =>

www-data 拥有 /var/www/ 的完全权限。

使用 exec() 并仅回显 return 值可能会错过输出的主要内容,因为它只会 return 输出的最后一行。在我的电脑上,如果我 运行

echo exec("ls");

我得到输出...

xsl.php

如果您向 exec() 添加第二个参数,所有输出都会发送到该参数。所以...

exec("ls", $output);
print_r($output);

输出...

Array
(
    [0] => Copy of data.xml
    [1] => Copy of test.json
    [2] => NewFile.html
    [...] // Shortened for example
    [35] => xsl.php
)

如果您的命令在输出的最后一行有一个空行,您将看到的就是这些。为确保您看到所有内容...

exec("../litecoin/bin/litecoin-cli getinfo", $output );
print_r($output);

我也会(在这种情况下)更改 exec 以使用绝对路径以确保我知道正在发生什么 运行 以及来自哪里...

exec("/var/www/litecoin/bin/litecoin-cli getinfo", $output );

关于权限,您的 apache 服务器 运行 为 www-data:www-data,因此请确保允许该用户执行脚本。对此有多种解决方案,最简单的方法是确保该用户拥有所有这些文件。

chown -R www-data:www-data /var/www/litecoin

我发现这种情况的主要区别在于环境和权限。错误 [4] => boost::filesystem::create_directory: Permission denied: "/.litecoin" 表明您的 php 页面正在 ~$HOME 中查找文件夹 litecoin,但未设置。这就是为什么它变成 /.litecoin

我使用以下代码创建了一个简单的 index.php 文件

<?php

$out = array();
exec("env", $out);

var_dump($out);

我的默认 php 的相同输出是

/home/vagrant/nginx/html/index.php:6:
array (size=9)
  0 => string 'APACHE_RUN_DIR=/var/run/apache2' (length=31)
  1 => string 'APACHE_PID_FILE=/var/run/apache2/apache2.pid' (length=44)
  2 => string 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' (length=65)
  3 => string 'APACHE_LOCK_DIR=/var/lock/apache2' (length=33)
  4 => string 'LANG=C' (length=6)
  5 => string 'APACHE_RUN_USER=www-data' (length=24)
  6 => string 'APACHE_RUN_GROUP=www-data' (length=25)
  7 => string 'APACHE_LOG_DIR=/var/log/apache2' (length=31)
  8 => string 'PWD=/home/vagrant/nginx/html' (length=28)

如您所见,有 $HOME,这可能是导致问题的一个可能原因

所以您应该确保正确的环境可用于您的可执行文件 运行。你可以这样做

exec("HOME=/var/www/html X=Y A=B env", $out);

命令的输出显示它可以看到更新的变量

/home/vagrant/nginx/html/index.php:6:
array (size=12)
  0 => string 'HOME=/var/www/html' (length=18)
  1 => string 'APACHE_RUN_DIR=/var/run/apache2' (length=31)
  2 => string 'APACHE_PID_FILE=/var/run/apache2/apache2.pid' (length=44)
  3 => string 'A=B' (length=3)
  4 => string 'X=Y' (length=3)
  5 => string 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' (length=65)
  6 => string 'APACHE_LOCK_DIR=/var/lock/apache2' (length=33)
  7 => string 'LANG=C' (length=6)
  8 => string 'APACHE_RUN_USER=www-data' (length=24)
  9 => string 'APACHE_RUN_GROUP=www-data' (length=25)
  10 => string 'APACHE_LOG_DIR=/var/log/apache2' (length=31)
  11 => string 'PWD=/home/vagrant/nginx/html' (length=28)

确定您需要哪些环境变量并确保它们存在并尝试设置路径,以便您的可执行文件使用 /var/www/var/www/html 它可以访问的任何路径,然后执行程序