apache — PHP exec () не работает — ошибка разрешения?

Я пытаюсь использовать exec() запустить программу в /var/www/litecoin/bin а также echo выход.

В основном это:
(от /var/www/html/index.php)

<?php
echo exec("../litecoin/bin/litecoin-cli getinfo");
?>

Это просто показывает пустую страницу, хотя.

Я знаю, что это, вероятно, ошибка разрешения, так как работает ls работает нормально, но я понятия не имею, как это исправить. (или если есть лучший способ сделать что-то)

Запуск команды напрямую через терминал работает нормально.
Я использую PHP7.0 и Apache на Ubuntu 16.04, если это имеет значение.

редактировать

Он работает нормально, когда я запускаю его через терминал, делая php index.php когда вошел в www-data, но когда я открываю его в веб-браузере, кажется, он не выполняется /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 /.

0

Решение

Основное различие в таких случаях, которое я нахожу, — это среда и разрешения. Ошибка [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 к какому пути он имеет доступ, а затем выполняет программу

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
2

По вопросам рекламы [email protected]