rsync через SSH сохраняет владение только для файлов, принадлежащих www-данным - PullRequest
12 голосов
/ 06 марта 2012

Я использую rsync для репликации структуры веб-папок с локального сервера на удаленный сервер. Оба сервера являются Ubuntu Linux. Я использую следующую команду, и она хорошо работает:

rsync -az /var/www/ user@10.1.1.1:/var/www/

Имена пользователей для локальной и удаленной систем различны. Из того, что я прочитал, возможно, не удастся сохранить всех владельцев файлов и папок и групп. Это нормально, но я бы хотел сохранить владельцев и группы только для пользователя www-data, который существует на обоих серверах.

Возможно ли это? Если так, как бы я поступил так?

** РЕДАКТИРОВАТЬ **

Некоторые упоминания о возможности rsync сохранять права владения и группы при удаленной синхронизации файлов здесь: http://lists.samba.org/archive/rsync/2005-August/013203.html

** РЕДАКТИРОВАТЬ 2 **

Я получил желаемый эффект благодаря множеству полезных комментариев и ответов здесь. Предполагая, что IP-адрес компьютера-источника равен 10.1.1.2, а IP-адрес компьютера-получателя - 10.1.1.1. Я могу использовать эту строку с машины назначения:

sudo rsync -az user@10.1.1.2:/var/www/ /var/www/

Это сохраняет владельца и группы файлов с общим именем пользователя, например www-data. Обратите внимание, что использование rsync без sudo не сохраняет эти разрешения.

Ответы [ 6 ]

21 голосов
/ 06 марта 2012

Вы также можете выполнить sudo rsync на целевом хосте, используя опцию --rsync-path:

# rsync -av --rsync-path="sudo rsync" /path/to/files user@targethost:/path

Это позволяет вам аутентифицироваться как user на целевом хосте, но при этом получать привилегированное разрешение на запись через sudo. Вам придется изменить файл sudoers на целевом хосте, чтобы избежать запроса sudo на ваш пароль. man sudoers или выполните sudo visudo для получения инструкций и образцов.

Вы упоминаете, что хотели бы сохранить право собственности на файлы, принадлежащие www-данным, но не на другие файлы. Если это действительно так, то вам может не повезти, если вы не введете chown или не выполните второй запуск rsync для обновления разрешений. Невозможно сообщить rsync о сохранении прав собственности для только для одного пользователя .

Тем не менее, вы должны прочитать о параметре rsync --files-from.

rsync -av /path/to/files user@targethost:/path
find /path/to/files -user www-data -print | \
  rsync -av --files-from=- --rsync-path="sudo rsync" /path/to/files user@targethost:/path

Я не проверял это, поэтому я не уверен, как именно будет работать вывод команды find в --files-from=-. Вам, несомненно, нужно будет экспериментировать.

3 голосов
/ 14 июня 2013

У меня была похожая проблема, и я обманул команду rsync,

rsync -avz - удалить root @ xxxx: / home // domains / site / public_html / / home / domains2 / public_html && chown -Rwwwusr: wwwgrp / home / domains2 / public_html /

&& запускает chown для папки после успешного завершения rsync (1x '&' запускает chown независимо от состояния завершения rsync)

3 голосов
/ 06 марта 2012

Корневые пользователи для локальной системы и удаленной системы различны.

Что это значит?Пользователь root имеет uid 0. Чем они отличаются?

Любой пользователь с разрешением на чтение в каталогах, которые вы хотите скопировать, может определить, какие имена пользователей принадлежат каким файлам.Только root может изменить владельца файлов, которые записаны .

В настоящее время вы запускаете команду на исходном компьютере, которая ограничивает ваши записи разрешениями, связанными с user@10.1.1.1.Вместо этого вы можете попробовать запустить команду как root на компьютере target .Ваш доступ для чтения на исходном компьютере не является проблемой.

Таким образом, на целевом компьютере (10.1.1.1) предполагается, что источником является 10.1.1.2:

# rsync -az user@10.1.1.2:/var/www/ /var/www/

Убедитесь, что ваши группы совпадают на обеих машинах.

Кроме того, настройте доступ к user@10.1.1.2 с помощью ключа DSA или RSA, чтобы избежать паролей.Например, от имени пользователя root на целевой машине выполните:

# ssh-keygen -d

Затем возьмите содержимое файла /root/.ssh/id_dsa.pub и добавьте его в ~user/.ssh/authorized_keys на исходном компьютере.Вы можете ssh user@10.1.1.2 как пользователь root с целевой машины, чтобы увидеть, работает ли он.Если вы получили запрос на ввод пароля, проверьте журнал ошибок, чтобы узнать, почему ключ не работает.

3 голосов
/ 06 марта 2012

Насколько я знаю, вы не можете chown файлы кому-то, кроме вас, если вы не root.Таким образом, вам придется rsync, используя учетную запись www-data, так как все файлы будут созданы с указанным пользователем в качестве владельца.Поэтому вам нужно chown файлы потом.

2 голосов
/ 06 марта 2012

Что ж, вы могли бы вообще пропустить проблемы rsync и просто сделать это через tar-туннель.

sudo tar zcf - /path/to/files | \
  ssh user@remotehost "cd /some/path; sudo tar zxf -"

Вам нужно будет настроить ключи SSH, как описано Грэмом.

Обратите внимание, что это обрабатывает полные копии каталогов, а не инкрементные обновления, такие как rsync.

Идея здесь такова:

  • вы смените каталог, вместо
  • создавая файл tar, вы отправляете вывод tar в stdout,
  • , который выводится через команду SSH на , получая tar на другом хосте,
  • , ночто получающий tar запускается с помощью sudo, поэтому он имеет привилегированный доступ на запись для заданных имен пользователей.
0 голосов
/ 17 октября 2018

rsync версия 3.1.2

В основном я использую окна локально, поэтому это командная строка, которую я использую для синхронизации файлов с сервером (debian):

user@user-PC /cygdrive/c/wamp64/www/projects

$ rsync -rptgoDvhP --chown=www-data:www-data --exclude=.env --exclude=vendor --exclude=node_modules --exclude=.git --exclude=tests --exclude=.phpintel --exclude=storage ./website/ username@hostname:/var/www/html/website
...