php rsync с exec() не работает
Почему это:
rsync -avz -e ssh /home/userneme/folder username@domain.com:/var/www/folder
работает от cronjob и это:
exec("rsync -avz -e ssh /home/userneme/folder username@domain.com:/var/www/folder");
не работает
Я знаю, что exec работает, потому что в моем appp есть несколько мест, которые конвертируют из pdf в jpg с помощью ImageMagick (exec).
РЕШИТЬ
exec работает нормально, это была проблема с разрешением на удаленном сервере. "Локальный" сервер - это общая учетная запись посредника, а удаленный сервер - мой первый блок VPS Ubuntu 10.10 LAMP. Если бы только у меня был системный администратор, так как я просто разработчик программного обеспечения, вынужденный делать это, и я воняю этим:) Спасибо всем!
4 ответа
Ваши ключи ssh также должны быть в домашней папке apache. Если нет, rsync не будет работать.
С уважением
Это, вероятно, связано с PATH. попробуйте выполнить rsync с полным путем, например
exec("/usr/bin/rsync -avz -e ssh /home/userneme/folder username@domain.com:/var/www/folder");
Есть ли у вашего хоста safe_mode
на?
Бежать php -i |grep -i safe
, Если безопасный режим включен, то посмотрите на safe_mode_exec_dir
, Если rsync отсутствует в одной из перечисленных папок, то PHP не выполнит его.
Вы можете попросить своего хоста поместить символическую ссылку на rsync в exec_dir
путь, а затем выполнить его из этого места; но это зависит от их политики относительно того, позволят ли они это.
Вы должны быть в состоянии сделать это, дав ssh конкретный файл ключа для использования в -e
вариант rsync. Поскольку вы используете общий хост, вам нужно создать ключ ssh где-нибудь в безопасном месте, а затем поместить ключи на хост в некотором каталоге настолько безопасно, насколько вы можете получить (должен читаться только вами и apache, но если Кто-нибудь еще знает об этом, они могут использовать PHP-скрипт или что-то еще, чтобы apache отправил им ваш ключ. Если ваш хост использует suexec для скриптов, поэтому все они запускаются под вашим именем пользователя, вы можете сделать его доступным для чтения только вам.)
Тогда вы бы использовать
rsync -avz -e "ssh -i /some/id_?sa_key" /home/userneme/folder username@domain.com:/var/www/folder
Поскольку это не очень безопасно, вы должны настроить файл авторизованных ключей удаленной стороны, чтобы заставить команду, как минимум, убедиться, что выполняемая команда является "rsync".
Подробнее об автоматизации rsync (включая скрипт для проверки команды ssh) здесь.