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

时间:2018-03-17 04:20:22

标签: php apache permissions litecoin

我尝试使用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时运行正常,但是当我在网络浏览器中打开它时,它似乎无法执行{{1}毕竟。

修改2

将错误从stderr重定向到stdout(/var/www/litecoin/bin/litecoin-cli)时,我得到以下内容:

2>&1

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我找到的这种情况的主要区别是环境和权限。错误[4] => boost::filesystem::create_directory: Permission denied: "/.litecoin"表明您的php页面正在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无论它有权访问哪个路径,然后执行程序