Jak dowolnie mapować własności użytkowników / grup w rsync

17

Muszę zsynchronizować katalog ze zdalnym serwerem, aby wszystkie pliki należące do użytkownika X i grupy Y na maszynie źródłowej (lokalnej) były mapowane na użytkownika W i grupę Z na maszynie docelowej (zdalnej). Jeśli to możliwe, używając ssh jako transportu, ale jeśli muszę użyć demona rsync, to również jest w porządku.

Czy jest na to sposób? Szukam sposobu na ustanowienie dowolnej mapy użytkowników / grup, takiej jak

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

To powinien być dość powszechny przypadek użycia, prawda? Np. Mam pliki na moim komputerze lokalnym, gdzie moja nazwa użytkownika to X, i muszę przesłać je na serwer sieciowy, gdzie muszą należeć do danego użytkownika, który nie ma tej samej nazwy ani tego samego identyfikatora UID, co mój użytkownik na mój komputer osobisty.

Nie mogę tego znaleźć na stronie manuala rsync ...

LINUX na komputerze lokalnym i zdalnym (Ubuntu local, centOS remote)

Polecenie, które próbowałem: rsync -avz / path / to / local [email protected]: / path / to / remote

matteo
źródło
1
Należy zawsze podać swój system operacyjny. Rozwiązania bardzo często zależą od używanego systemu operacyjnego. Czy korzystasz z systemu Windows, Linux, Unix, OSX, BSD? Która wersja
terdon

Odpowiedzi:

21

Rsync wersja 3.1.0 wprowadziła właśnie w tym celu opcje --usermapi --groupmap. Zobacz stronę manuala .

Michel Schinz
źródło
To dobrze wiedzieć. Na pewno jest do tego scenariusz. Na przykład mam dwa serwery Icinga i muszę przeprowadzić jednokierunkową synchronizację plików konfiguracyjnych z nadrzędnego na podrzędny. Ale icinga na mistrzu jest innym UID niż icinga na niewolniku. Dobrze wiedzieć, że rsync sobie z tym poradzi.
Michael Martinez,
Uwagi do wersji: Ubuntu v16.04 ma v3.1.1, CentOS 7 ma v3.1.2, ale CentOS 6 ma v3.0.6. Działa to świetnie w przypadku nowszych dystrybucji.
jimp
4

Ostatnia wersja (co najmniej 3.1.1) rsync pozwala określić „zdalną własność”:

--usermap=tom:www-data

Zmienia właściciela tomu na www-data (inaczej PHP / Nginx). Jeśli używasz Maca jako klienta, użyj brew, aby uaktualnić do ostatniej wersji. A na serwerze pobierz źródła archiwów, a następnie „zrób to”!

Thomas Decaux
źródło
dla mnie działa jako --chown = tom: www-data
Federico Galli
0

Jeśli chcesz zmienić własność plików na dowolnych użytkowników, musisz najpierw zostać rootem w polu docelowym.

Nie wydaje mi się, aby taka funkcja była zintegrowana z rsync, ale można ją osiągnąć, uruchamiając a findpo wykonaniu rsync.

Być może takie polecenie załatwi sprawę: Na przykład przetłumacz z UID 1000 => 505 i UID 1001 => 700:

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

Jeśli masz wielu użytkowników, możesz rozważyć użycie pętli z mapowaniem w swoim języku preferencji.

Baw się dobrze.

Adrien M.
źródło
Ok, więc po prostu nie ma sposobu, aby rsync to zrobił. Zdumiewające, wydawało mi się to tak oczywistą potrzebą.
matteo,
1
@ matteo ostrożnie, jeśli tego używasz. Jeśli na zdalnym komputerze znajduje się użytkownik o identyfikatorze 1000 lub 1001, w zdalnych lokalizacjach mogą znajdować się pliki, które są jego prawowitym właścicielem, a ich przeglądanie może powodować problemy.
terdon
@terdon, jak mógłby być użytkownik bez nazwy na zdalnym komputerze? (ponieważ jeśli identyfikator jest wyświetlany zamiast nazwy, gdy pliki są na liście, oznacza to, że użytkownik nie ma nazwy, prawda?)
matteo
1
@ matteo nie, każdy użytkownik ma identyfikator użytkownika oraz nazwę. W większości systemów opartych na Debianie (i prawdopodobnie w innych) pierwszym domyślnym użytkownikiem jest użytkownik 1000. Spróbuj uruchomić idna swoim komputerze, aby zobaczyć. Dlatego jeśli użyjesz takich identyfikatorów, zakładasz, że na komputerze zdalnym nie ma użytkownika o tym samym identyfikatorze i prawdopodobnie nie jest to prawda.
terdon
w moim przypadku na serwerze nie ma użytkownika o UID 1000, przynajmniej nie ma go w / etc / passwd. Zgadłem, ponieważ kiedy wyświetlam listę plików z „ls -la”, pliki należące do 1000 (które były wynikiem rsync -avz z mojego komputera lokalnego, gdzie użytkownik 1000 to mój domyślny użytkownik „teo”) pokazują się z „1000 „jako właściciel. Jeśli byłby użytkownik o tym identyfikatorze, a jego nazwa brzmiała „Ktoś”, wówczas właściciel plików byłby pokazywany jako „Ktoś” na wyjściu ls, prawda? W każdym razie jest to przydatne zastrzeżenie, które należy wziąć pod uwagę, dzięki.
matteo,
-1

Nie jestem pewien, czy rozumiem, aby połączyć się ssh, musisz podać nazwę użytkownika. Nazwą użytkownika będzie użytkownik W na zdalnym komputerze należący do grupy Z. Dlatego wszystko zostanie przesłane dokładnie tak, jak chcesz:

rsync /path/to/local [email protected]/path/to/remote

EDYCJA w odpowiedzi na komentarz PO.

Jeśli chcesz wykonać to mapowanie użytkowników i nie utracić ustawień uprawnień, nie używaj -a. Najpierw uruchom rsync, [email protected]aby uzyskać prawidłową nazwę użytkownika. Następnie zamiast tego -aspowoduje to zachowanie własności, określ opcje ręcznie. Od 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

-aAktywuje więc wszystkie powyższe opcje, ale nie chcesz zachować grupy ani właściciela. To polecenie powinno robić, co chcesz:

rsync -rlptDvz /path/to/local [email protected]:/path/to/remote

Ponieważ logujesz się teraz jako użytkownik mywwwi nie zapisujesz już informacji o właścicielu / grupie, kopie wykonane przez użytkownika rsyncbędą należeć do mywwwużytkownika.

terdon
źródło
Nie, robię rsync -avz / path / to / local [email protected]: / path / to / remote. Moje pytanie brzmi: w jaki sposób mogę uzyskać pliki należące do użytkownika „x” na moim komputerze lokalnym, aby można je było ponownie przypisać do użytkownika „w” na serwerze? Na moim komputerze moje pliki należą do „teo”. Na serwerze nie ma nawet użytkownika o nazwie „teo”, potrzebuję tego użytkownika, którego używa apache, powiedz „mywww”; i to samo dla grupy. Domyślnie rsync będzie próbował zachować właściciela jako „teo”, a ponieważ nie ma takiego użytkownika, zachowa UID, w wyniku czego pliki należące do użytkownika „1000”, który nie istnieje na serwerze
matteo
Btw, jednocześnie muszę zachować uprawnienia do plików, co już robi zgodnie z opcją -a. Chodzi mi o to, że każde rozwiązanie, które sprawi, że stracę możliwość zachowania uprawnień do plików (tj. Plik 777 pozostanie 777, a 600 pozostanie 600) nie załatwi sprawy
Matteo,
@matteo to dlatego, że -aumożliwia zachowanie opcji właściciela i grupy. Zobacz moją zaktualizowaną odpowiedź.
terdon
1
@matteo proszę wyjaśnić, czego tak naprawdę potrzebujesz, zadając pytania. W ten sposób nie tracimy czasu na udzielanie niepełnych odpowiedzi. Następnym razem pamiętaj o: i) dołączeniu rzeczywistych poleceń, których użyłeś (rsync domyślnie niczego nie zachowuje, twoje użycie tego -adokonało) ii) jasno wyjaśnij wszystkie ograniczenia, które posiadasz, wspomniałeś tylko o jednym użytkowniku do ostatniego komentarza i iii ) wspomnij o swoim systemie operacyjnym. W każdym razie sposobem na to rsyncbyłoby skopiowanie jednego zestawu plików jako, mywww@remotea następnego zestawu jako root@remote.
terdon
1
@ matteo tak naprawdę nie było jasne, że używasz tego, -aco zachowuje własność. Podane przykłady sugerowały, że musisz to zrobić tylko dla jednego użytkownika. W każdym razie, polecam użyć rsync, po prostu sporządzić listę różnych plików, które chcesz skopiować dla każdego użytkownika i uruchomić wiele rsyncs łączących się ze zdalnym komputerem z odpowiednią nazwą użytkownika. To będzie prostsze i bezpieczniejsze.
terdon