Como mapear arbitrariamente propriedades de usuário / grupo em rsync

9

Eu preciso rsync um diretório para um servidor remoto para que todos os arquivos pertencentes ao usuário X e grupo Y na máquina de origem (local) sejam mapeados para o usuário W e grupo Z na máquina de destino (remota). Se possível, usando ssh como o transporte, mas se eu precisar usar o daemon rsync, tudo bem.

Existe uma maneira de fazer isso? Eu estou procurando uma maneira de estabelecer um mapa de usuário / grupo arbitrário, como

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

Este deve ser um caso de uso bastante comum, não é? Por exemplo. Eu tenho arquivos no meu computador local onde meu nome de usuário é X, e preciso enviá-los para um servidor da Web onde eles precisam pertencer a um determinado usuário que não tenha o mesmo nome ou o mesmo UID do meu usuário no meu computador pessoal.

Não consigo encontrar isso na página man do rsync ...

LINUX na máquina local e remota (local do Ubuntu, centOS remoto)

Comando Eu tentei:     rsync -avz / path / to / local [email protected]: / caminho / para / remoto

    
por matteo 07.11.2013 / 18:41

4 respostas

14

Rsync versão 3.1.0 introduziu o --usermap e o --groupmap opções precisamente para esse fim. Veja a página de manual .

    
por 05.02.2014 / 17:04
3

A última versão (pelo menos 3.1.1) do rsync permite que você especifique a "propriedade remota":

--usermap=tom:www-data

Altera a propriedade do tom para www-data (também conhecido como PHP / Nginx). Se você estiver usando o Mac como cliente, use brew para atualizar para a última versão. E no seu servidor, faça o download de fontes de arquivos e, em seguida, "faça" isso!

    
por 03.12.2014 / 11:15
1

Se você quiser alterar a propriedade dos arquivos para usuários arbitrários, primeiro será necessário fazer o root na caixa de destino.

Eu não acho que haja um recurso desse tipo integrado pelo rsync, mas você pode achá-lo executando um find depois de fazer o seu rsync.

Talvez, um comando como esse faça o truque: Por exemplo, traduza do 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 você tiver muitos usuários, considere o uso de um loop com um mapeamento em sua linguagem de predilecção.

Divirta-se.

    
por 07.11.2013 / 20:07
0

Não tenho certeza se entendi, para se conectar com ssh você precisa fornecer um nome de usuário. Esse nome de usuário será o usuário W na máquina remota que pertence ao grupo Z. Portanto, tudo será transferido exatamente como você deseja:

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

EDIT em resposta ao comentário do OP.

Se você deseja fazer esse mapeamento de usuários e não perder as configurações de permissões, não use -a . Primeiro, execute o rsync com [email protected] para obter o nome de usuário correto. Em seguida, em vez de -a , que fará com que você preserve a propriedade, especifique as opções manualmente. De 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

Portanto, -a ativa todas as opções acima, mas você não quer preservar o grupo ou o proprietário. Este comando deve fazer o que você quer:

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

Como agora você está efetuando login como mywww e não está mais preservando as informações do proprietário / grupo, as cópias feitas por rsync pertencerão ao usuário mywww .

    
por 07.11.2013 / 18:55