PHP exec () не будет выполнять команду оболочки при ее выполнении через браузер

У меня есть определенный PHP-скрипт, который вызывает exec () для выполнения команды для преобразования PDF в JPG. Эта команда отлично работает в bash.

Чтобы упредить ваши первоначальные догадки об устранении неполадок, обратите внимание на следующее:

  • safe_mode = Выкл.
  • Разрешение в каталоге, содержащем PDF-файл и скрипт, установлено в 777, и этот каталог также находится там, где записывается JPG.
  • Команда, которую я передаю exec (), явно указывает на используемый двоичный файл (например, / usr / local / bin / convert).
  • display_errors = On
  • error_reporting = E_ALL
  • disable_functions = [blank]
  • Я повторяю вывод exec () и ничего не возвращает. Команда, выполняемая по умолчанию, ничего не возвращает.

Когда я вызываю этот PHP-скрипт из браузера (посещение http://www.example.com/script.php ), exec () не выполняет свой аргумент.

ВАЖНО : Я знаю, что нет никаких проблем с моим скриптом или способом, которым я создал команду bash, потому что из bash я могу выполнить скрипт с «php», и он работает (например, «php script.php» преобразует файл)

Я также попытался отключить exec () с помощью system ().

Наконец, у меня была эта проблема раньше, но я не помню, как я ее исправил.

Я знаю, что чего-то не хватает, поэтому я надеюсь, что кто-то еще испытал это, как я, и помню, как это исправить!

Заранее благодарю вас за любую помощь, которую вы можете предоставить.

Alex

Related of "PHP exec () не будет выполнять команду оболочки при ее выполнении через браузер"

Добавьте 2>&1 в конец вашей команды, чтобы перенаправить ошибки из stderr в stdout. Это должно дать понять, что происходит не так.

Достаточно предположить, может быть, пользователь вашего веб-сервера не имеет привилегий для этого.

Поскольку он работает, когда из командной строки (который будет находиться под вашей учетной записью пользователя), он звучит для меня как учетная запись, на которой работает веб-сервер (часто «www-data»), не имеет разрешений на выполнение в программе преобразования ,

Вы рассматривали права доступа к файлам? В браузере php работает под одним пользователем, но когда вы запускаете его в bash, он, скорее всего, работает с вашими разрешениями пользователей.

Это первое, что я проверю.

Эми

У вашего пользователя Apache / webserver есть необходимые права для запуска команды оболочки?

Когда вы запускаете из cl, вы, скорее всего, работаете как другой пользователь, который может объяснить, какой cl работает, но через браузер не работает.

Это может быть связано с тем, что разные пользователи запускают скрипт через веб-сервер и скрипт через bash.

Обычно скрипты / exec, вызываемые через сервер, как и пользователь 'www', и этот пользователь не имеют доступа к записи в вашу область. но когда вы запускаете скрипт в bash, у вас есть права на запись.

Пользовательским www-data Apache должны быть предоставлены привилегии для выполнения определенных приложений с использованием sudo .

  1. Запустите команду sudo visudo . На самом деле мы хотим отредактировать файл в etc/sudoers Для этого, используя sudo visudo в терминале, он дублирует (temp) файл sudoers для редактирования.
  2. В конце файла добавьте следующий ex: -если мы хотим использовать команду для перезапуска smokeping и команду mount для другого действия,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount

(Предполагается, что вы хотите запустить команды restart и mount с использованием привилегий суперпользователя (root).)

Однако, если вы хотите запускать каждое приложение с использованием привилегий суперпользователя, добавьте следующее вместо того, что указано выше. Возможно, вы не хотите делать это, а не для ALL команд, очень опасно.

 www-data ALL=NOPASSWD: ALL 

3. После редактирования файла sudoers (по visudo мы редактируем временный файл sudoers чтобы сохранить и закрыть файл temp (visudo) для записи в файле sudoers . ( wq! )

4. Вот что, теперь используйте exec() следующим образом внутри вашего скрипта xxx.php . не забудьте использовать sudo перед использованием команды в скрипте php.

например: –

 exec ("sudo /etc/init.d/smokeping restart 2>&1"); 

Поэтому в вашей проблеме добавьте команды, которые вы хотите использовать, к step no (2.) когда я добавляю и изменяю ваш php-скрипт так, как вы хотите.

Я решил, что это проблема с ImageMagick, а не с PHP. Я пытаюсь сделать несколько исправлений, и если они не сработают, я собираюсь в конечном итоге использовать некоторую библиотеку PHP (возможно, imagic), чтобы выполнить эту работу.

Устройство вывода по умолчанию изменено.

login as www (после включения) дает вывод через оболочку, но не через php.