Як довільно відобразити власність користувачів / груп у 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


1
Будь ласка, завжди включайте вашу ОС. Рішення дуже часто залежать від операційної системи, яка використовується. Використовуєте Windows, Linux, Unix, OSX, BSD? Яка версія?
тердон

Відповіді:


21

Rsync версії 3.1.0 представив --usermapі --groupmapпараметри саме для цієї мети. Дивіться сторінку чоловіка .


Це добре знати. Для цього напевно є сценарій використання. Наприклад, у мене є два сервери Icinga, і мені потрібно зробити односторонню синхронізацію файлів конфігурації від master до slave. Але ічінга на господаря - це інший уід, ніж ічінга на рабі. Отже, добре знати, що rsync може впоратися з цим.
Майкл Мартінес

Примітки до версії: Ubuntu v16.04 має v3.1.1, у CentOS 7 - v3.1.2, але у CentOS 6 - v3.0.6. Це чудово підходить для нових дистрибутивів.
jimp

4

Остання версія (принаймні 3.1.1) rsync дозволяє вказати "віддалене володіння":

--usermap=tom:www-data

Змінює право власності на дані www (дані PHP / Nginx). Якщо ви використовуєте Mac як клієнт, використовуйте варити, щоб оновити до останньої версії. А на своєму сервері завантажте джерела архівів, а потім "зробіть" це!


для мене це працює як --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 Як би на віддаленій машині з'явився користувач без імені? (адже якщо в списках файлів замість імені відображається ідентифікатор, це означає, що у користувача немає імені, правда?)
Маттео

1
@matteo ні, кожен користувач має ідентифікатор користувача, а також ім'я. У більшості систем на базі Debian (і, мабуть, інших) першим користувачем за замовчуванням є користувач 1000. Спробуйте запустити idна своїй машині, щоб побачити. Тому, якщо ви використовуєте такі ідентифікатори, ви припускаєте, що на віддаленій машині немає користувача, який має той самий ідентифікатор, і це, швидше за все, не відповідає дійсності.
тердон

у моєму випадку на сервері немає користувача з UID 1000, принаймні він не вказаний у / etc / passwd. Про що я здогадався, тому що, коли я перераховую файли з "ls -la", файли, що належать до 1000 (які були результатом rsync -avz з моєї локальної машини, де користувач 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користувачеві.


Ні, я роблю rsync -avz / шлях / до / локального root@myhost.com: / шлях / до / віддалений. Моє запитання: як я можу отримати файли, що належать користувачеві "x" на моїй локальній машині, переобладнані на користувачеві "w" на сервері? На моєму комп’ютері мої файли належать до "teo". На сервері немає навіть користувача, який називається "teo", мені потрібен користувач, який використовує апаш, скажімо, "mywww"; те ж саме для групи. За замовчуванням rsync намагатиметься зберегти власника як "teo", а оскільки такого користувача немає, він збереже UID, в результаті чого файли, що належать користувачеві "1000", який не існує, на сервері
matteo

Btw, в той же час мені потрібно зберегти дозволи файлів, які він вже робить відповідно до параметра -a. Я маю на увазі, будь-яке рішення, яке змусить мене втратити можливість збереження дозволів на файли (тобто файл 777 залишається 777, а 600 залишається 600), не зробить цього фокусу
матте

@matteo це тому, що -aдозволяє зберегти параметри власника та групи. Дивіться мою оновлену відповідь.
тердон

1
@matteo, будь ласка, поясніть, що вам насправді потрібно, коли ви ставите запитання. Таким чином ми не витрачаємо час на неповні відповіді. Наступного разу пам’ятайте, що i) включіть фактично використані вами команди (rsync за замовчуванням нічого не зберігає; ваше використання -aзробив це) ii) чітко поясніть всі обмеження, які у вас є, ви тільки що згадали про одного користувача до останнього коментаря та iii ) згадати вашу ОС. У будь-якому випадку, способом зробити це rsyncбуло б скопіювати один набір файлів як mywww@remoteі наступний набір як root@remote.
тердон

1
@matteo, що насправді було незрозумілим - це те, що ти використовуєш, -aщо зберігає право власності. Наведені вами приклади запропонували зробити це лише одному користувачеві. У будь-якому разі я рекомендую вам скористатися rsync, просто складіть список різних файлів, які ви хочете скопіювати для кожного користувача, і запустіть кілька rsyncs, що підключаються до віддаленої машини з відповідним іменем користувача. Це буде простіше і безпечніше.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.