Как мне синхронизировать локальные и удаленные папки с помощью rsync изнутри php-скрипта, не запрашивая пароль?
У меня есть уже настроил открытый ключ для автоматизации входа на удаленный сервер для моего пользователя.
Так что это работает без проблем из cli:
rsync -r -a -v -e "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/;
Но когда я пытаюсь запустить то же самое из сценария PHP (на веб-странице на моем локальном сервере):
$c='rsync -r -a -v -e "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/';
//exec($c,$data);
passthru($c,$data);
print_r($data);
Вот что я получаю:
255
И ни один файл не загружается с локального на удаленный сервер.
При поиске в сети я нашел эту подсказку :
«Здесь можно использовать комбинацию команд оболочки BASh и Expect, но это будет не очень безопасно, потому что это автоматизирует вход в систему с правами root. Сгенерируйте ключи для никто
или apache
(вне зависимости от того, под каким пользователем запускается Apache). В качестве альтернативы установите phpSuExec, Suhosin или suPHP, чтобы скрипты запускались от имени пользователя, для которого они были вызваны »
Ну, я не знаю, как «автоматизировать вход в систему с правами root» для PHP, который работает как «apache». Может быть, лучше запустить скрипт от имени реального пользователя, я не знаю ... Спасибо!
ОБНОВЛЕНИЕ: Сгенерируйте ключи для никто
или apache
(независимо от пользователя, от имени которого выполняется Apache). В качестве альтернативы установите phpSuExec, Suhosin или suPHP, чтобы сценарии запускались от имени пользователя, для которого они были вызваны ».
Я не знаю, как« автоматизировать вход в систему с правами root »для PHP, который работает как "apache". Может быть, лучше запустить скрипт от имени реального пользователя, я не знаю ... Спасибо!
ОБНОВЛЕНИЕ: Сгенерируйте ключи для никто
или apache
(независимо от пользователя, от имени которого выполняется Apache). В качестве альтернативы установите phpSuExec, Suhosin или suPHP, чтобы сценарии запускались от имени пользователя, для которого они были вызваны ».
Я не знаю, как« автоматизировать вход в систему с правами root »для PHP, который работает как "apache". Может быть, лучше запустить скрипт от имени реального пользователя, я не знаю ... Спасибо!
ОБНОВЛЕНИЕ: - Поскольку это нормально работает:
passthru('ssh user@111.111.11.111 | ls',$data);
Возвращая список домашнего фодера, я могу быть уверен, что с автоматическим входом в систему нет проблем. Это должно быть что-то с rsync, запущенным из сценария PHP.
ОБНОВЛЕНИЕ:
Вся проблема связана с тем, что «при запуске из командной строки ssh использует ключевые файлы в $ HOME / .ssh /, но под PHP запускается. используя пользователя Apache, поэтому у него может не быть $ HOME, не говоря уже о $ HOME / .ssh / id_dsa. Итак, либо вы специально указываете ему, какой ключевой файл использовать, либо вручную создаете этот каталог и его содержимое »
Хотя Я не могу получить rsync, вот как мне удалось передать файл с локального на удаленный:
if($con=ssh2_connect('111.111.11.111',22)) echo 'ok!';
if(ssh2_auth_password($con,'apache','xxxxxx')) echo ' ok!';
if(ssh2_scp_send($con,'localfile','/remotefolder',0755)) echo ' ok!';
Требуется локальный файл: 0644 Требуется удаленная папка: 0775
Думаю, если бы решением не было запускать php с тем же пользователем, что и bash ...
@Yzmir Ramirez предложил следующее: «Я не думаю, что вы хотите» скопировать ключ где-то там, где apache может его достать "- это нарушение безопасности. Лучше изменить скрипт для запуска от имени защищенного пользователя, а затем настроить ключи .ssh для входа между серверами без пароля.
Это то, что я придется потратить еще немного времени. Если кто-то знает, как это сделать, пожалуйста, это будет большим подспорьем.