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/.

2 ответа

Решение

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

С помощью 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
Другие вопросы по тегам