Как произвольно отобразить владения пользователей / групп в rsync

17

Мне нужно rsync каталог на удаленный сервер, чтобы все файлы, принадлежащие пользователю X и группе Y на исходном (локальном) компьютере, были сопоставлены с пользователем W и группой Z на конечном (удаленном) компьютере. Если возможно, используя ssh в качестве транспорта, но если мне нужно использовать демон rsync, это тоже хорошо.

Есть ли способ сделать это? Я ищу способ установить произвольную карту пользователя / группы, такую ​​как

local user X => remote user W
local group Y => remote group Z
... and as many of these as needed.

Это должно быть довольно распространенным случаем, не так ли? Например, у меня есть файлы на локальном компьютере, где мое имя пользователя - X, и мне нужно загрузить их на веб-сервер, где они должны принадлежать данному пользователю, который не имеет ни того же имени, ни того же UID, что и мой пользователь на мой персональный компьютер.

Я не могу найти это на странице руководства rsync ...

LINUX на локальной и удаленной машине (локальная Ubuntu, удаленная система centOS)

Команда, которую я попробовал: rsync -avz / path / to / local root@myhost.com: / path / to / remote

Matteo
источник
1
Пожалуйста, всегда включайте вашу ОС. Решения очень часто зависят от используемой операционной системы. Вы используете Windows, Linux, Unix, OSX, BSD? Какая версия?
Terdon

Ответы:

21

Rsync версии 3.1.0 введена --usermapи --groupmapварианты именно для этой цели. Смотрите справочную страницу .

Мишель Шинц
источник
Это хорошо знать. Там определенно сценарий использования для этого. Например, у меня есть два сервера Icinga, и мне нужно выполнить одностороннюю синхронизацию файлов конфигурации от главного к подчиненному. Но исинга на хозяине - это иное, чем исинга на рабе. Итак, приятно знать, что rsync справится с этим.
Майкл Мартинес
Примечания к версии: Ubuntu v16.04 имеет версию 3.1.1, CentOS 7 - версию 3.1.2, а CentOS 6 - версию 3.0.6. Это прекрасно работает для новых дистрибутивов.
Джимп
4

Последняя версия (не менее 3.1.1) rsync позволяет вам указать «удаленное владение»:

--usermap=tom:www-data

Смена владельца сайта на www-data (он же PHP / Nginx). Если вы используете Mac в качестве клиента, используйте brew для обновления до последней версии. А на вашем сервере скачайте архивы с источниками, затем «сделайте» это!

Томас Деко
источник
для меня это работает как --chown = tom: www-data
Федерико Галли
0

Если вы хотите сменить владельца файлов на произвольного пользователя, сначала вам нужно быть суперпользователем в поле назначения.

Я не думаю, что есть такая функция, встроенная в rsync, но вы можете добиться этого, запустив findпосле выполнения rsync.

Может быть, такая команда подойдет: например, перевести с UID 1000 => 505 и UID 1001 => 700:

find /your/rsynced/path -user 1000 -exec chown 505 {} \;
find /your/rsynced/path -user 1001 -exec chown 700 {} \;

Если у вас много пользователей, вы можете рассмотреть возможность использования цикла с отображением на вашем языке пристрастий.

Повеселись.

Адриен М.
источник
Итак, просто нет способа заставить rsync это сделать. Удивительно, но мне это казалось очевидной необходимостью.
Маттео
1
@matteo осторожно, если вы используете это. Если на удаленном компьютере есть пользователь с идентификатором 1000 или 1001, в удаленных расположениях могут находиться файлы, которые на законных основаниях принадлежат им, и их переполнение может вызвать проблемы.
Terdon
@terdon как будет пользователь без имени на удаленной машине? (потому что если в списке файлов указан идентификатор вместо имени, это означает, что у пользователя нет имени, верно?)
matteo
1
@matteo нет, у каждого пользователя есть как идентификатор пользователя, так и имя. В большинстве систем на основе Debian (и, возможно, других) первым пользователем по умолчанию является пользователь 1000. Попробуйте запустить idна своем компьютере, чтобы увидеть. Поэтому, если вы используете идентификаторы, подобные этому, вы предполагаете, что на удаленном компьютере нет пользователя с таким идентификатором, что, вероятно, не соответствует действительности.
Terdon
в моем случае на сервере нет пользователя с UID 1000, по крайней мере, его нет в / etc / passwd. Именно об этом я и догадывался, потому что когда я перечисляю файлы с помощью «ls -la», файлы, принадлежащие 1000 (которые были результатом rsync -avz с моей локальной машины, где user 1000 - мой пользователь по умолчанию «teo»), отображаются с «1000 "как владелец. Если бы был пользователь с таким идентификатором и его имя было, скажем, «Кто-то», то владелец файлов был бы показан как «Кто-то» в выводе ls, верно? Во всяком случае, это полезное предостережение, чтобы принять во внимание, спасибо.
Маттео
-1

Я не уверен, что понимаю, чтобы подключиться через sshвас необходимо предоставить имя пользователя. Этим именем пользователя будет пользователь W на удаленной машине, принадлежащий группе Z. Поэтому все будет передаваться именно так, как вы хотите:

rsync /path/to/local userX@remote.com/path/to/remote

РЕДАКТИРОВАТЬ в ответ на комментарий ОП.

Если вы хотите сделать это сопоставление пользователей и не потерять настройки разрешений, не используйте -a. Сначала запустите rsync, mywww@myhost.comчтобы получить правильное имя пользователя. Затем вместо того, -aчтобы заставить вас сохранить право собственности, укажите параметры вручную. От man rsync:

    -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
    -r, --recursive             recurse into directories
    -l, --links                 copy symlinks as symlinks
    -p, --perms                 preserve permissions
    -t, --times                 preserve modification times
    -g, --group                 preserve group
    -o, --owner                 preserve owner (super-user only)
    -D                          same as --devices --specials

Итак, -aактивирует все вышеперечисленные опции, но вы не хотите сохранять группу или владельца. Эта команда должна делать то, что вы хотите:

rsync -rlptDvz /path/to/local mywww@myhost.com:/path/to/remote

Поскольку вы вошли в систему как mywwwвладелец / информация о группе и больше не сохраняете ее, копии, сделанные пользователем, rsyncбудут принадлежать mywwwпользователю.

terdon
источник
Нет, я делаю rsync -avz / path / to / local root@myhost.com: / path / to / remote. У меня вопрос, как я могу получить файлы, принадлежащие пользователю "x" на моем локальном компьютере, чтобы переназначить на пользователя "w" на сервере? На моем компьютере мои файлы принадлежат "teo". На сервере нет даже пользователя с именем «teo», мне нужно, чтобы пользователь был тем, кого использует Apache, скажем «mywww»; и то же самое для группы. По умолчанию rsync попытается сохранить владельца как «teo», и, поскольку такого пользователя нет, он сохранит UID, в результате чего файлы, принадлежащие пользователю «1000», который не существует на сервере
matteo
Кстати, в то же время мне нужно сохранить права доступа к файлам, которые он уже делает в соответствии с параметром -a. Я имею в виду, любое решение , которое заставит меня потерять возможность сохранить права доступа к файлам (т.е. 777 файла остается 777 и 600 остаются 600) не будет делать трюк
Маттео
@matteo потому что -aпозволяет сохранить параметры владельца и группы. Смотрите мой обновленный ответ.
Terdon
1
@matteo, пожалуйста, объясни, что тебе действительно нужно, когда ты задаешь вопросы. Таким образом, мы не тратим время на неполные ответы. В следующий раз не забудьте i) включить фактические команды, которые вы использовали (rsync ничего не сохраняет по умолчанию, ваше использование -aсделало это) ii) четко объяснить все ваши ограничения, вы упомянули одного пользователя до последнего комментария и iii ) упомяните свою ОС. В любом случае, способ сделать это rsync- скопировать один набор файлов, а mywww@remoteследующий набор как root@remote.
Terdon
1
@matteo то , что было на самом деле не ясно, что вы использовали -a, сохраняющий право собственности. Приведенные вами примеры показывают, что вам нужно сделать это только для одного пользователя. В любом случае, я бы порекомендовал вам использовать rsync, просто составьте список различных файлов, которые вы хотите скопировать для каждого пользователя, и запустите несколько rsyncs, подключающихся к удаленной машине с соответствующим именем пользователя. Это будет проще и безопаснее.
Terdon