Come mappare arbitrariamente le proprietà degli utenti / gruppi in rsync


17

Devo risincronizzare una directory su un server remoto in modo che tutti i file appartenenti all'utente X e al gruppo Y sul computer di origine (locale) siano mappati all'utente W e al gruppo Z sul computer di destinazione (remoto). Se possibile usando ssh come trasporto, ma se ho bisogno di usare il demone rsync, va bene lo stesso.

C'è un modo per farlo? Sto cercando un modo per stabilire una mappa utente / gruppo arbitraria, come

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

Questo dovrebbe essere un caso d'uso piuttosto comune, vero? Ad esempio, ho dei file sul mio computer locale in cui il mio nome utente è X e devo caricarli su un server Web in cui devono appartenere a un determinato utente che non ha lo stesso nome o lo stesso UID del mio utente su il mio personal computer.

Non lo trovo nella pagina man di rsync ...

LINUX su macchine sia locali che remote (Ubuntu local, centOS remote)

Comando che ho provato: rsync -avz / path / to / local root@myhost.com: / path / to / remote


1
Ti preghiamo di includere sempre il tuo sistema operativo. Le soluzioni dipendono molto spesso dal sistema operativo in uso. Stai usando Windows, Linux, Unix, OSX, BSD? Quale versione?
terdon,

Risposte:


21

Rsync versione 3.1.0 ha introdotto le opzioni --usermape --groupmapproprio a tale scopo. Vedi la pagina man .


Questo è buono a sapersi. C'è sicuramente uno scenario d'uso per questo. Ad esempio, ho due server Icinga e devo fare una sincronizzazione unidirezionale dei file di configurazione dal master allo slave. Ma icinga sul master è un uid diverso da icinga sullo slave. Quindi, buono a sapersi, rsync può gestirlo.
Michael Martinez,

Note sulla versione: Ubuntu v16.04 ha v3.1.1, CentOS 7 ha v3.1.2, ma CentOS 6 ha v3.0.6. Funziona benissimo per le nuove distribuzioni.
jimp

4

L'ultima versione (almeno 3.1.1) di rsync consente di specificare la "proprietà remota":

--usermap=tom:www-data

Cambia la proprietà di Tom in dati www (aka PHP / Nginx). Se si utilizza Mac come client, utilizzare brew per eseguire l'aggiornamento all'ultima versione. E sul tuo server, scarica le fonti degli archivi, quindi "crealo"!


per me funziona come --chown = tom: www-data
Federico Galli,

0

Se vuoi cambiare la proprietà dei file in utenti arbitrari, devi prima essere root nella casella di destinazione.

Non penso che ci sia una tale funzione integrata da rsync, ma puoi ottenerla eseguendo un finddopo aver eseguito la tua rsync.

Forse, un comando come questo farà il trucco: ad esempio, tradurre da UID 1000 => 505 e UID 1001 => 700:

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

Se hai molti utenti, potresti prendere in considerazione l'utilizzo di un loop con una mappatura, nella tua lingua di predilezione.

Divertiti.


Ok, quindi non c'è modo di farlo fare a rsync. Sorprendente, mi è sembrato un bisogno così evidente.
matteo,

1
@matteo attento se lo usi. Se sul computer remoto è presente un utente con ID 1000 o 1001, è possibile che vi siano file di proprietà legittima degli stessi nelle posizioni remote e il loro chown potrebbe causare problemi.
terdon,

@terdon come ci sarebbe un utente senza un nome sul computer remoto? (perché se l'ID viene mostrato al posto del nome quando i file sono elencati, significa che l'utente non ha un nome, giusto?)
matteo

1
@matteo no, ogni utente ha un ID utente e un nome. Nella maggior parte dei sistemi basati su Debian (e probabilmente in altri) il primo, l'utente predefinito è l'utente 1000. Prova a eseguire idsul tuo computer per vedere. Pertanto, se si utilizzano gli ID in questo modo, si presuppone che non vi sia alcun utente con lo stesso ID sul computer remoto e che probabilmente non è vero.
terdon,

nel mio caso non c'è nessun utente con UID 1000 sul server, almeno non è elencato in / etc / passwd. Il che era ciò che ho indovinato perché quando elencherò i file con "ls -la", i file appartenenti a 1000 (che erano il risultato di rsync -avz dal mio computer locale dove l'utente 1000 è il mio utente predefinito "teo") vengono visualizzati con "1000 "come il proprietario. Se ci fosse un utente con quell'id, e il suo nome fosse, dì "Qualcuno", allora il proprietario dei file verrebbe mostrato come "Qualcuno" nell'output di ls, giusto? Comunque, questo è un avvertimento utile da tenere in considerazione, grazie.
matteo,

-1

Non sono sicuro di aver capito, per connetterti sshdevi fornire un nome utente. Tale nome utente sarà l'utente W sul computer remoto appartenente al gruppo Z. Pertanto, tutto verrà trasferito esattamente come si desidera che sia:

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

MODIFICA in risposta al commento del PO.

Se si desidera eseguire questa mappatura utente e non perdere le impostazioni delle autorizzazioni, non utilizzare -a. Innanzitutto, esegui rsync con mywww@myhost.comper ottenere il nome utente giusto. Quindi, invece di -afarti conservare la proprietà, specifica le opzioni manualmente. Da 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

Quindi, -aattiva tutte le opzioni precedenti ma non vuoi preservare il gruppo o il proprietario. Questo comando dovrebbe fare quello che vuoi:

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

Dal momento che ora si accede come mywwwe non si conservano più le informazioni sul proprietario / gruppo, le copie fatte rsyncappartengono mywwwall'utente.


No, faccio rsync -avz / path / to / local root@myhost.com: / path / to / remote. La mia domanda è: come posso rimappare i file appartenenti all'utente "x" sul mio computer locale all'utente "w" sul server? Sul mio computer, i miei file appartengono a "teo". Sul server non c'è nemmeno un utente chiamato "teo", ho bisogno che l'utente sia quello che usa Apache, dì "mywww"; e lo stesso per il gruppo. Per impostazione predefinita, rsync tenterà di preservare il proprietario come "teo" e, poiché non esiste tale utente, manterrà l'UID, risultando in file appartenenti all'utente "1000" che è un utente inesistente sul server
matteo

A proposito, allo stesso tempo ho bisogno di conservare i permessi dei file che fa già secondo l'opzione -a. Voglio dire, qualsiasi soluzione che mi farà perdere la capacità di preservare i permessi dei file (cioè un file 777 rimane un 777 e un 600 rimane un 600) non farà il trucco
matteo

@matteo è perché -aabilita il proprietario di conservazione e le opzioni di gruppo. Vedi la mia risposta aggiornata.
terdon,

1
@matteo, per favore, spiega di cosa hai realmente bisogno quando fai domande. In questo modo non perdiamo tempo a fornire risposte incomplete. La prossima volta, ricordati di i) includere gli effettivi comandi che hai usato (rsync non conserva nulla per impostazione predefinita, il tuo uso lo ha -afatto) ii) spiegare chiaramente tutti i vincoli che hai, hai appena menzionato un singolo utente fino al tuo ultimo commento e iii ) menziona il tuo sistema operativo. Ad ogni modo, il modo per farlo rsyncsarebbe copiare un set di file come mywww@remotee il set successivo come root@remote.
terdon,

1
@matteo quello che non era chiaro era che stavi usando per -apreservare la proprietà. Gli esempi forniti suggeriscono che è necessario eseguire questa operazione per un solo utente. Ad ogni modo, ti consiglio di usare rsync, basta fare un elenco dei diversi file che vuoi copiare per ciascun utente ed eseguire più rsync collegandoti alla macchina remota con il nome utente pertinente. Sarà più semplice e sicuro.
terdon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.