【问题标题】:PHP exec() not working - permission error?PHP exec() 不工作 - 权限错误?
【发布时间】:2018-08-26 05:06:55
【问题描述】:

我正在尝试使用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&gt;&amp;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/ 的完全权限。

【问题讨论】:

  • 我认为问题在于环境不同。您应该尝试运行$out = array(); exec("env", $out); var_dump($out); 并查看是否缺少HOME 环境变量?我认为这是您的情况下没有正确设置环境变量的问题

标签: php apache permissions litecoin


【解决方案1】:

使用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

【讨论】:

  • 我做了所有这些,但我仍然无法让它工作。我只是得到一个空数组。获取输出似乎不是错误,因为它首先没有运行可执行文件。
  • 好的,当我通过终端运行它时它工作正常,但是当我通过网络浏览器运行它时它不起作用。
  • 您能否在以 www-data 身份登录时尝试从 cli 运行(可能必须这样做 sudo su -s /bin/bash www-data
  • 我得到异常:N5boost10filesystem16filesystem_errorE boost::filesystem::create_directory: Permission denied: "/var/www/.litecoin" litecoin in AppInit() litecoind:chainparamsbase.cpp:69: const CBaseChainParams& BaseParams( ): 断言 `globalChainBaseParams' 失败。中止(核心转储)
  • 好的,现在检查 /var/www/.litecoin 文件的所有权并在必要时将其更改为 www-data。
【解决方案2】:

我发现在这种情况下的主要区别是环境和权限。错误[4] =&gt; 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 它可以访问的任何路径,然后执行程序

【讨论】:

  • 这似乎是问题所在,谢谢!为什么通过浏览器运行时环境变量不同,而不是在以 www-data 身份登录时在终端中运行?不应该一样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
相关资源
最近更新 更多