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

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

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

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

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

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

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

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

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

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

Алекс


person Alex    schedule 11.02.2009    source источник
comment
Какие аргументы передаются для преобразования? Указывают ли они полный путь к файлу?   -  person Powerlord    schedule 12.02.2009
comment
В PHP 5 обязательно используйте E_ALL | E_STRICT для полного сообщения об ошибках.   -  person Ross    schedule 12.02.2009
comment
ОБНОВЛЕНИЕ - ВАЖНО: я обнаружил, что это проблема с ImageMagick, и выполнил преобразование PDF в JPEG с помощью GhostScript (с гораздо более длинной командой) вместо использования ImageMagick в качестве посредника. Не было проблем с PHP, моими разрешениями или exec (). Спасибо за ваш вклад!   -  person Alex    schedule 13.02.2009


Ответы (9)


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

person Greg    schedule 11.02.2009
comment
Да, я получаю странную ошибку ImageMagick: convert: отсутствует имя файла изображения `test.jpg '@ convert.c / ConvertImageCommand / 2766. После небольшого поиска в Google, похоже, что это может быть выпуск с ошибками. Я перестраиваю последнюю стабильную ревизию и тестирую через несколько минут. - person Alex; 12.02.2009
comment
что означают 2 ›и 1? и как это называется? - person Patoshi パトシ; 26.08.2015

Просто предположение, возможно, у пользователя процесса вашего веб-сервера нет прав на это.

person TomHastjarjanto    schedule 11.02.2009
comment
Отлично! Это очень хороший момент. Если вы вызываете сценарий bash с помощью exec (через php), убедитесь, что сценарий bash также доступен для чтения Apache. - person mr-euro; 16.11.2010

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

person Chad Birch    schedule 11.02.2009
comment
Как можно дать разрешения? - person glarkou; 24.12.2011

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

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

Эми

person Amy Anuszewski    schedule 11.02.2009

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

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

person ConroyP    schedule 11.02.2009
comment
как проверить пермисс? - person Márcio Rossato; 08.03.2017

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

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

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

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

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

www-data ALL=NOPASSWD: ALL

3. После редактирования файла sudoers (к visudo мы редактируем временный файл sudoers, поэтому сохраните и выйдите из временного файла (visudo) для записи в sudoers файл. (_ 15_)

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

ex:-

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

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

person Thusitha Sumanadasa    schedule 09.04.2014

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

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

person Community    schedule 19.12.2009

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

person Alex    schedule 12.02.2009

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

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

person Rudger    schedule 14.01.2010