Como mapear arbitrariamente as propriedades de usuários / grupos no rsync

17

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

Existe uma maneira de fazer isso? 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 em que meu nome de usuário é X e preciso enviá-los para um servidor da Web em que eles precisam pertencer a um determinado usuário que não possui o mesmo nome ou o mesmo UID do meu usuário. meu computador pessoal.

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

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

Comando que tentei: rsync -avz / path / to / local [email protected]: / path / to / remote

matteo
fonte
1
Por favor, sempre incluir o seu OS. As soluções geralmente dependem do sistema operacional que está sendo usado. Você está usando Windows, Linux, Unix, OSX, BSD? Qual versão?
terdon

Respostas:

21

A versão 3.1.0 do Rsync introduziu as opções --usermape --groupmapexatamente para esse fim. Veja a página do manual .

Michel Schinz
fonte
Isso é bom de saber. Definitivamente, há um cenário de caso de uso para isso. Por exemplo, eu tenho dois servidores Icinga e preciso fazer uma sincronização unidirecional dos arquivos de configuração do mestre para o escravo. Mas icinga no mestre é um uid diferente de icinga no escravo. Portanto, é bom saber que o rsync pode lidar com isso.
Michael Martinez
Notas de versão: Ubuntu v16.04 tem v3.1.1, CentOS 7 tem v3.1.2, mas CentOS 6 tem v3.0.6. Isso funciona muito bem para distros mais recentes.
jimp
4

A última versão (pelo menos 3.1.1) do rsync permite especificar a "propriedade remota":

--usermap=tom:www-data

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

Thomas Decaux
fonte
para mim ele funciona como --chown = Tom: www-data
Federico Galli
0

Se você deseja alterar a propriedade dos arquivos para usuários arbitrários, primeiro precisa ser root na caixa de destino.

Eu não acho que exista esse recurso integrado pelo rsync, mas você pode obtê-lo executando um findapós executar o rsync.

Talvez um comando como esse funcione: 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 usar um loop com um mapeamento, no seu idioma de predileção.

Diverta-se.

Adrien M.
fonte
Ok, então simplesmente não há uma maneira de o rsync fazer isso. Surpreendente, pareceu-me uma necessidade tão óbvia.
Matteo
1
@matteo cuidado se você usar isso. Se houver um usuário com o ID 1000 ou 1001 na máquina remota, pode haver arquivos que pertencem legitimamente a eles nos locais remotos, e a tarefa de exibi-los pode causar problemas.
terdon
@terdon, como haveria um usuário sem nome na máquina remota? (porque se o ID é mostrado em vez do nome quando os arquivos são listados, isso significa que o usuário não tem um nome, certo?)
Matteo
1
@matteo não, todo usuário tem um ID de usuário e um nome. Na maioria dos sistemas baseados no Debian (e provavelmente em outros), o primeiro usuário padrão é o usuário 1000. Tente rodar idna sua máquina para ver. Portanto, se você usar os IDs como este, estará assumindo que não há usuário com o mesmo ID na máquina remota e que provavelmente não é verdadeiro.
terdon
no meu caso, não há usuário com UID 1000 no servidor, pelo menos ele não está listado em / etc / passwd. O que adivinhei, porque quando listo arquivos com "ls -la", arquivos pertencentes a 1000 (que foram o resultado de rsync -avz da minha máquina local em que o usuário 1000 é meu usuário padrão "teo") aparecem com "1000 "como o proprietário. Se houvesse um usuário com esse ID e seu nome fosse, digamos "Alguém", o proprietário dos arquivos seria mostrado como "Alguém" na saída de ls, certo? De qualquer forma, isso é uma advertência útil a ser levada em consideração, obrigado.
Matteo
-1

Não sei se entendi que, para se conectar, sshvocê 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ário 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 -afazer 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, -aativa todas as opções acima, mas você não deseja preservar o grupo ou o proprietário. Este comando deve fazer o que você deseja:

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

Como agora você está efetuando login mywwwe não preservando mais as informações do proprietário / grupo, as cópias feitas por rsyncpertencerão ao mywwwusuário.

Terdon
fonte
Não, eu faço rsync -avz / path / to / local [email protected]: / path / to / remote. Minha pergunta é: como faço para que os arquivos pertencentes ao usuário "x" na minha máquina local sejam remapeados para o usuário "w" no servidor? No meu computador, meus arquivos pertencem a "teo". No servidor não existe nem um usuário chamado "teo", eu preciso que ele seja o que o apache usa, diga "mywww"; e o mesmo para o grupo. Por padrão, o rsync tentará preservar o proprietário como "teo" e, como não existe esse usuário, ele preservará o UID, resultando em arquivos pertencentes ao usuário "1000", que é um usuário inexistente no servidor
matteo
Btw, ao mesmo tempo, preciso preservar as permissões de arquivo que ele já faz conforme a opção -a. Quer dizer, qualquer solução que vai me fazer perder a capacidade de preservar as permissões de arquivo (ou seja, um arquivo de 777 continuam a ser um 777 e um 600 continuam a ser um 600) não vai fazer o truque
Matteo
@matteo é porque -ahabilita as opções de proprietário e grupo de preservação. Veja minha resposta atualizada.
terdon
1
@matteo, explique o que você realmente precisa quando fizer perguntas. Dessa forma, não perdemos tempo fornecendo respostas incompletas. Da próxima vez, lembre-se de i) incluir os comandos reais que você usou (o rsync não preserva nada por padrão, seu uso -afez isso) ii) explica claramente todas as restrições que você possui, você mencionou um único usuário até seu último comentário e iii ) mencione seu sistema operacional. De qualquer forma, a maneira de fazer isso rsyncseria copiar um conjunto de arquivos como mywww@remotee o próximo conjunto como root@remote.
terdon
1
@matteo, o que realmente não estava claro era que você estava usando o -aque preserva a propriedade. Os exemplos que você deu sugeriram que você só precisava fazer isso para um usuário. De qualquer forma, eu recomendo que você use rsync, basta fazer uma lista dos diferentes arquivos que você deseja copiar para cada usuário e executar vários rsyncs conectando-se à máquina remota com o nome de usuário relevante. Isso será mais simples e seguro.
Ter13