PHP exec() 不工作 - 权限错误?
PHP exec() not working - permission error?
我正在尝试将 exec()
用于 运行 /var/www/litecoin/bin
中的程序和 echo
输出。
基本上是这样的:
(来自 /var/www/html/index.php
)
<?php
echo exec("../litecoin/bin/litecoin-cli getinfo");
?>
不过它只是显示一个空白页。
我知道这可能是一个权限错误,因为 运行ning ls
工作正常,但我不知道如何修复它。 (或者如果有更好的做事方式)
运行 直接通过终端的命令工作正常。
如果重要的话,我正在 PHP7.0 和 Ubuntu 16.04 上使用 Apache。
编辑
当我 运行 它在登录 www-data
时通过终端执行 php index.php
时它工作正常,但是当我在网络浏览器中打开它时它似乎没有执行/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/ 的完全权限。
使用 exec()
并仅回显 return 值可能会错过输出的主要内容,因为它只会 return 输出的最后一行。在我的电脑上,如果我 运行
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: 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
它可以访问的任何路径,然后执行程序
我正在尝试将 exec()
用于 运行 /var/www/litecoin/bin
中的程序和 echo
输出。
基本上是这样的:
(来自 /var/www/html/index.php
)
<?php
echo exec("../litecoin/bin/litecoin-cli getinfo");
?>
不过它只是显示一个空白页。
我知道这可能是一个权限错误,因为 运行ning ls
工作正常,但我不知道如何修复它。 (或者如果有更好的做事方式)
运行 直接通过终端的命令工作正常。 如果重要的话,我正在 PHP7.0 和 Ubuntu 16.04 上使用 Apache。
编辑
当我 运行 它在登录 www-data
时通过终端执行 php index.php
时它工作正常,但是当我在网络浏览器中打开它时它似乎没有执行/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/ 的完全权限。
使用 exec()
并仅回显 return 值可能会错过输出的主要内容,因为它只会 return 输出的最后一行。在我的电脑上,如果我 运行
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: 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
它可以访问的任何路径,然后执行程序