PHP exec () не будет выполнять команду оболочки при выполнении через браузер - PullRequest
32 голосов
/ 12 февраля 2009

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

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

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

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

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

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

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

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

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

Alex

Ответы [ 9 ]

68 голосов
/ 12 февраля 2009

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

6 голосов
/ 12 февраля 2009

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

5 голосов
/ 12 февраля 2009

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

3 голосов
/ 12 февраля 2009

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

Это первое, что я бы проверил.

Amy

2 голосов
/ 12 февраля 2009

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

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

1 голос
/ 09 апреля 2014

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

  1. Запустите команду sudo visudo. На самом деле мы хотим отредактировать файл в etc/sudoers. Для этого, используя sudo visudo в терминале, он дублирует (temp) 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 файл. (wq!)

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

например: -

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

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

1 голос
/ 19 декабря 2009

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

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

0 голосов
/ 14 января 2010

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

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

0 голосов
/ 12 февраля 2009

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

...