Синхронизировать локальные и удаленные папки с помощью rsync из сценария php без ввода пароля

Как мне синхронизировать локальные и удаленные папки с помощью 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.

  • Еще на всякий случай у меня есть chmod -R 0777 в локальной и удаленной папках. Но я еще не понял.

ОБНОВЛЕНИЕ:

Вся проблема связана с тем, что «при запуске из командной строки 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 для входа между серверами без пароля.

Это то, что я придется потратить еще немного времени. Если кто-то знает, как это сделать, пожалуйста, это будет большим подспорьем.

5
задан Roger 24 January 2011 в 10:02
поделиться