Я пишу сценарий для резервного копирования некоторых файлов с помощью утилиты командной строки 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 ....');
несколько вопросов, которые могут помочь вам определить причину проблемы:
Как правило, такие проблемы часто возникают из-за разницы в окружающей среде. Например, $ PATH может быть другим, и вместо того, чтобы полагаться на него, чтобы найти для вас программу, вы должны либо убедиться, что он включил необходимые каталоги, либо включить полное имя пути в команду.
Посмотрите вывод phpinfo (), чтобы увидеть, перечислены ли эти вызовы функций в disable_functions, что предотвращает их выполнение.
Если вы запускаете это из сценария PHP, вы имеете в виду, что сценарий PHP запускается из командной строки, или вы имеете в виду, что он запускается чем-то через веб-сервер?
Если вы пытаетесь запустить его через веб-интерфейс, велика вероятность, что он пытается запускаться как пользователь. nobody
в группе nobody
у кого нет реальных разрешений по соображениям безопасности.
Вы должны иметь возможность тестировать пользовательский контекст как часть вашего скрипта, но есть множество вещей, которые вы можете изменить, чтобы решить проблему, - некоторые из них могут зависеть от вашей среды и / или технического уровня. Возможности включают биты setuid, suexec, изменение контекста Apache и т. Д.