rsync через SSH сохраняет владение только для файлов, принадлежащих www-данным
Я использую 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 ответов
Вы также можете sudo rsync на целевом хосте, используя --rsync-path
опция:
# rsync -av --rsync-path="sudo rsync" /path/to/files user@targethost:/path
Это позволяет вам аутентифицироваться как user
на targethost, но все равно получите привилегированное разрешение на запись через 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
Я не проверял это, поэтому я не уверен, как именно вывод найден в --files-from=-
буду работать. Вам, несомненно, нужно будет экспериментировать.
Пользователи root для локальной системы и удаленной системы различны.
Что это значит? Пользователь root - это uid 0. Чем они отличаются?
Любой пользователь с разрешением на чтение в каталогах, которые вы хотите скопировать, может определить, какие имена пользователей принадлежат каким файлам. Только root может изменить владельца записываемых файлов.
В настоящее время вы запускаете команду на исходном компьютере, которая ограничивает ваши записи разрешениями, связанными с user@10.1.1.1. Вместо этого вы можете попробовать запустить команду от имени пользователя root на целевой машине. Ваш доступ для чтения на исходном компьютере не является проблемой.
Таким образом, на целевой машине (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 с целевой машины, чтобы увидеть, работает ли он. Если вы получили запрос на ввод пароля, проверьте журнал ошибок, чтобы узнать, почему ключ не работает.
У меня была похожая проблема, и я обманул команду rsync,
rsync -avz - удалить root@xxxx:/home//domains/site/public_html/ /home/domains2/public_html && chown -R wwwusr:wwwgrp /home/domains2/public_html/
&& запускает chown для папки после успешного завершения rsync (1x '&' запускает chown независимо от состояния завершения rsync)
Насколько я знаю, вы не можете chown
файлы кому-то, кроме вас, если вы не root. Так что вам придется rsync
с использованием www-data
учетной записи, так как все файлы будут созданы с указанным пользователем в качестве владельца. Так что вам нужно chown
файлы потом.
Ну, вы могли бы вообще пропустить проблемы 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, поэтому у него есть привилегированный доступ на запись для заданных имен пользователей.
rsync версия 3.1.2
В основном я использую windows в локальной среде, так что это командная строка, которую я использую для синхронизации файлов с сервером (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