Назад | Перейти на главную страницу

Почему команда оболочки запускается из командной строки, а не из скрипта php?

Я пишу сценарий для резервного копирования некоторых файлов с помощью утилиты командной строки s3cmd amazon s3.

Когда я запускаю команду оболочки s3cmd из оболочки, она прекрасно создает резервную копию файла. Когда я запускаю ту же команду из PHP-скрипта (используя обратные кавычки или shell_exec), она ничего не делает и не возвращает никаких результатов в PHP-скрипт.

Другие команды оболочки успешно выполняются аналогичным образом (обратные кавычки), такие как mysqldump и tar. используя whoami в скрипте и оболочке, я обнаружил, что пользователь оболочки - root, а пользователь PHP-скрипта - apache.

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

Проблема с s3cmd в этом случае заключается не в файле s3cmd, а в файле конфигурации, который по умолчанию ~ / .s3cfg

Сценарий CLI, который запускается от имени пользователя root, имеет доступ для чтения к нему, а веб-сервер apache - нет.

Все, что вам нужно сделать, это скопировать файл конфигурации в другое место и отредактировать его, чтобы пользователь apache мог получить к нему доступ, а затем в shell_exec использовать -c FILE вариант s3cmd.

Кроме того, вам нужно установить env var HOME в пустую строку, потому что сценарий s3cmd дает ей приоритет перед -c. Так что ваши shell_exec будет выглядеть примерно так: shell_exec('export HOME="";s3cmd -c ....');

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

  • У вас есть соответствующие права на каталог, в который вы пытаетесь писать?
  • Команда запускается как простой пользователь (я не знаю s3, извините)
  • вы смотрели журналы?

Как правило, такие проблемы часто возникают из-за разницы в окружающей среде. Например, $ PATH может быть другим, и вместо того, чтобы полагаться на него, чтобы найти для вас программу, вы должны либо убедиться, что он включил необходимые каталоги, либо включить полное имя пути в команду.

Посмотрите вывод phpinfo (), чтобы увидеть, перечислены ли эти вызовы функций в disable_functions, что предотвращает их выполнение.

Если вы запускаете это из сценария PHP, вы имеете в виду, что сценарий PHP запускается из командной строки, или вы имеете в виду, что он запускается чем-то через веб-сервер?

Если вы пытаетесь запустить его через веб-интерфейс, велика вероятность, что он пытается запускаться как пользователь. nobody в группе nobody у кого нет реальных разрешений по соображениям безопасности.

Вы должны иметь возможность тестировать пользовательский контекст как часть вашего скрипта, но есть множество вещей, которые вы можете изменить, чтобы решить проблему, - некоторые из них могут зависеть от вашей среды и / или технического уровня. Возможности включают биты setuid, suexec, изменение контекста Apache и т. Д.