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

Мне нужно 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

5 ответов

Решение

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

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

--usermap=tom:www-data

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

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

Я не думаю, что есть такая функция, интегрированная в 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 {} \;

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

Повеселись.

Как упоминалось в комментариях Федерико и Торка , существует более простой способ для типичного варианта использования, который, я считаю, и был тем, чего хотел ОП. Принятый ответ сопоставляет только указанного пользователя и группу, оставляя все остальные как есть, что может быть неверным. Вам нужно будет добавить резервное сопоставление или сначала проверить право собственности на все на отправляющей стороне. Если это нежелательно и вам просто нужно, чтобы все файлы в месте назначения соответствовали конкретному пользователю и группе, используйте следующее:

      --chown=USER:GROUP

Очевидно, заменитьUSER&GROUPс фактическим пунктом назначения.

Я не уверен, что понимаю, чтобы подключиться через 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 пользователь.

Другие вопросы по тегам