Почему это:
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 работает, потому что у меня есть несколько мест в моем приложении, которые выполняют преобразование из pdf в jpg с помощью ImageMagick (exec).
Решено
exec работает нормально, это была проблема с разрешением на удаленном сервере. «Локальный» сервер - это общая учетная запись реселлера, а удаленный сервер - это мой первый VPS Ubuntu 10.10 LAMP. Если бы только у меня был системный администратор, ведь я всего лишь разработчик программного обеспечения, вынужденный делать это, и мне это не нравится :) Всем спасибо!
Ваши 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) Вот.