У меня возникла проблема с функцией PHP exec (). Кажется, он не вызывает определенные функции. Например, код echo exec('ls');
не производит никакого вывода (он должен, есть файлы в каталоге). Эта основная причина для меня – проблема в том, что я пытаюсь выполнить .jar из вызова PHP exec ().
Насколько я знаю, я правильно нахожу программу java, но я не получаю никакого вывода. Файл .jar может быть выполнен из командной строки на сервере. (Для записи это сервер Apache).
Мой php для выполнения .jar выглядит следующим образом:
$output = array(); exec('java -jar testJava.jar', $output); print_r($output);
Все, что я получаю для вывода этого вызова exec (), это Array()
.
У меня был успех с exec (), выполняющим 'whoami'
и 'pwd'
. Я не могу понять, почему некоторые функции работают, а некоторые нет. Я тоже не самый опытный человек с PHP, поэтому я не слишком уверен, как диагностировать проблему. Любая помощь будет оценена по достоинству.
Причина, по которой вы не можете выполнить ls, связана с разрешениями.
Если вы используете веб-сервер как пользователь A , вы можете использовать только те каталоги, у которых есть разрешения для пользователя A.
Вы можете либо изменить разрешение каталога, либо изменить пользователя, под которым работает сервер, изменив файл httpd.conf (я предполагаю, что вы используете apache).
Если вы изменяете права доступа к каталогу, убедитесь, что вы также изменяете разрешения родительских каталогов.
Чтобы изменить пользователя веб-сервера, выполните следующие действия:
Откройте следующий файл:
vi /etc/httpd/conf/httpd.conf
Искать
User apache Group apache
Измените имя пользователя и группы. После изменения пользователя и группы перезапустите сервер, используя следующую команду.
/sbin/service httpd restart
Затем вы сможете выполнять все команды, которые могут выполняться этим пользователем.
РЕДАКТИРОВАТЬ:
«Пользователь» должен быть пользователем без полномочий root в httpd.conf. Apache по умолчанию не обслуживает страницы при запуске от имени root. Вы должны установить пользователя как пользователя, не являющегося пользователем root, или вы получите ошибку. Если вы хотите заставить apache запускаться с правами root, тогда вы должны установить переменную среды, как показано ниже:
env CFLAGS=-DBIG_SECURITY_HOLE
Затем вам нужно перестроить apache, прежде чем вы сможете запустить его как root.
У меня есть решение: команда запускается с консоли, но не с php через exec / system / passthru. Проблема заключается в пути к команде. Он работает с абсолютным путем для команды
Так что:
wkhtmltopdf "htm1Eufn7.htm" "pdfIZrNcb.pdf"
будет выглядеть так:
/usr/local/bin/wkhtmltopdf "htm1Eufn7.htm" "pdfIZrNcb.pdf"
И теперь, это работает от php через exec Где команда двоичная вы можете видеть через whereis wkhtmltopdf
Я нашел проблему – SELinux блокировал доступ PHP к определенным функциям. Включение SELinux в разрешающий режим устранило проблемы (хотя я бы предпочел не оставлять SELinux в разрешающем режиме, я бы скорее нашел способ разрешить определенные функции, если смогу).
Ваша проблема не является проблемой выполнения, а синтаксисом команды exec. Второй аргумент всегда возвращается как массив и содержит одну строку вывода в каждом индексе. Возвращаемое значение функции exec будет содержать окончательную строку вывода команд. Чтобы показать вывод, вы можете использовать:
foreach ($ output as $ line) echo "$ line \ n";
Подробнее см. http://php.net/manual/en/function.exec.php . Вы также можете получить значение выхода команды с третьим аргументом.