Подтвердить что ты не робот

Rsync over SSH сохраняет право собственности только на файлы, принадлежащие www-данным

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

rsync -az /var/www/ [email protected]:/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 [email protected]:/var/www/ /var/www/

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

4b9b3361

Ответ 1

Вы также можете sudo rsync на целевом хосте с помощью параметра --rsync-path:

# rsync -av --rsync-path="sudo rsync" /path/to/files [email protected]:/path

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

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

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

rsync -av /path/to/files [email protected]:/path
find /path/to/files -user www-data -print | \
  rsync -av --files-from=- --rsync-path="sudo rsync" /path/to/files [email protected]:/path

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

Ответ 2

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

Ответ 3

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

rsync -avz --delete [email protected]:/home//domains/site/public_html//home/domains2/public_html && & && & && & chown -R wwwusr: wwwgrp/home/domains2/public_html/

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

Ответ 4

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

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

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

В настоящее время вы запускаете команду на исходном компьютере, которая ограничивает ваши записи разрешениями, связанными с [email protected] Вместо этого вы можете попробовать запустить команду с правами root на целевой машине. Ваш доступ на чтение на исходном компьютере не является проблемой.

Итак, на целевой машине (10.1.1.1), считая, что источник равен 10.1.1.2:

# rsync -az [email protected]:/var/www/ /var/www/

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

Кроме того, настройте доступ к [email protected] с помощью ключа DSA или RSA, чтобы вы могли не использовать пароли. Например, как root на вашей целевой машине, запустите:

# ssh-keygen -d

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

Ответ 5

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

sudo tar zcf - /path/to/files | \
  ssh [email protected] "cd /some/path; sudo tar zxf -"

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

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

Идея здесь в том, что:

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