0

我正在尝试使用exec()/var/www/litecoin/binecho输出中运行程序。

基本上,这个:(来自/var/www/html/index.php

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

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

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

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

编辑

php index.php当我在登录时通过终端运行它时它工作正常www-data,但是当我在网络浏览器中打开它时它似乎根本没有执行/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/ 拥有完全权限。

4

2 回答 2

2

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

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
于 2018-03-17T08:57:02.900 回答
1

我发现在这种情况下的主要区别是环境和权限。该错误[4] => boost::filesystem::create_directory: Permission denied: "/.litecoin"表明您的 php 页面正在查找or中的文件夹litecoin,但未设置。这就是为什么它变成~$HOME/.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它可以访问的任何路径,然后执行程序

于 2018-03-25T17:24:19.547 回答