Intereting Posts
pecl / solr can not, похоже, устанавливает нормальный Как передать переменную внутри функции? Выберите определенные поля MySQL и покажите их с помощью php Вставка изображения с помощью PHP и FPDF, не удалось загрузить большое изображение Что это значит в PHP -> or => Swift: как запросить внешнюю базу данных для входа в систему? Как получить доступ к значениям, выбранным в раскрывающемся списке мультиселектов в PHP? Могу ли я открыть предупреждение в javascript, используя php Получить услугу запроса из класса DataTransformer Laravel (5.3) Красноречивый – проблема отношений Найти длину маски совпадения начального сегмента на массивах Как конвертировать время сервера в локальное время? Как преобразовать скрипт с использованием функций mysql_ для использования функций mysqli_? PHP in_array не находит значение, которое есть Почему ссылки на моем прозрачном div становятся незаметными в IE?

PHP exec () не работает должным образом

У меня возникла проблема с функцией 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 . Вы также можете получить значение выхода команды с третьим аргументом.