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();行政长官