Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP exec()不工作-权限错误?_Php_Apache_Permissions_Litecoin - Fatal编程技术网

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

PHP exec()不工作-权限错误?,php,apache,permissions,litecoin,Php,Apache,Permissions,Litecoin,我试图使用exec()在/var/www/litecoin/bin和echo输出中运行一个程序 基本上,这是: (摘自/var/www/html/index.php) www data对/var/www/though具有完全权限。使用exec()并仅回显返回值可能会丢失输出的主要内容,因为它只会返回输出的最后一行。在我的计算机上,如果我运行 echo exec("ls"); 我得到了输出 xsl.php 如果将第二个参数添加到exec(),则所有输出都将发送到该参数。所以 exec("ls"

我试图使用
exec()
/var/www/litecoin/bin
echo
输出中运行一个程序

基本上,这是: (摘自
/var/www/html/index.php

www data对/var/www/though具有完全权限。

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

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

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

<?php

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

var_dump($out);
如您所见,存在
$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
它可以访问的路径,然后执行程序

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

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

<?php

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

var_dump($out);
如您所见,存在
$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
它可以访问的任何路径,然后执行程序

我做了所有这些,但我仍然无法让它工作。我只得到一个空数组。获取输出时似乎没有错误,因为它首先没有运行可执行文件。好的,当我通过终端运行它时,它工作正常,但当我通过web浏览器运行它时,它不工作。您可以尝试在作为www数据登录时从cli运行吗(可能必须执行
sudo su-s/bin/bash www-data
)我收到异常:N5Boost10文件系统16FileSystem_Error boost::filesystem::create_目录:权限被拒绝:“/var/www/.litecoin”AppInit()中的litecoin litecoin:chainparamsbase.cpp:69:const cbaseChainChainParams&BaseParams():断言“globalChainBaseParams”失败。中止(内核转储)好的,现在检查/var/www/.litecoin文件的所有权,并在必要时将其更改为www数据。我做了所有这些,但仍然无法使其工作。我只得到一个空数组。获取输出时似乎没有错误,因为它首先没有运行可执行文件。好的,当我通过终端运行它时,它工作正常,但当我通过web浏览器运行它时,它不工作。您可以尝试在作为www数据登录时从cli运行吗(可能必须执行
sudo su-s/bin/bash www-data
)我收到异常:N5Boost10文件系统16FileSystem_Error boost::filesystem::create_目录:权限被拒绝:“/var/www/.litecoin”AppInit()中的litecoin litecoin:chainparamsbase.cpp:69:const cbaseChainChainParams&BaseParams():断言“globalChainBaseParams”失败。中止(内核转储)好,现在检查/var/www/.litecoin文件的所有权,必要时将其更改为www数据。我认为问题在于env不同。您应该尝试运行
$out=array();执行官(“环境”,美元外);var_dump($out)
并查看是否缺少
HOME
环境变量?我认为这是一个环境变量没有在你的情况下正确设置的问题。我认为问题在于环境变量不同。您应该尝试运行
$out=array();行政长官