it-swarm.com.ru

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

У меня есть определенный 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

32
Alex

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

68
Greg

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

6
TomHastjarjanto

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

5
Chad Birch

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

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

Эми

3
Amy Anuszewski

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

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

2
ConroyP

Пользователю 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.phpscript. не забывайте использовать Sudo перед использованием команды в скрипте php.

например: -

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

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

1
Thusitha Sumanadasa

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

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

1
user235044

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

0
Alex

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

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

0
Rudger