Rsync com proprietário de destino e permissão é possível?

Rsync com proprietário de destino e permissão é possível?

O servidor de origem tem um proprietário que é root.

----/home/sub1/test1 
----/home/sub2/test1

Minha máquina local é o destino.

----/home/sub1/test1 owner by user1
----/home/sub2/test1 owner by user2

Como posso sincronizar o novo arquivo de atualização do servidor de origem para a máquina local e não alterar o proprietário local?

Editar

Preciso sincronizar todas as fontes em um comando porque tenho muitas pastas e a máquina local também tem muitos proprietários. Pode ser possível?

Obrigado.

Responder1

Parece que você não deseja que eles sejam alterados após a transferência.

Tente o comando abaixo:

rsync -avr -o -g /source/directory user@:destinationHost/destination/directory

Se você não usar essas opções, o usuário e o grupo serão alterados para o usuário invocador no destinatário. Se quiser especificar algum outro usuário, você precisará adicionar um comando chown ao seu script.

-o, --owner
    This option causes rsync to set the owner of the destination file to be 
    the same as  the source file, but only if the receiving rsync is being run 
    as the super-user (see also the --super and --fake-super options). Without 
    this option, the owner of new and/or transferred files are set to the invoking 
    user on the receiving side...

-g, --group
    This option causes rsync to set the group of the destination file to be the same as 
    the source file. If the receiving program is not running as the super-user (or if
    --no-super was specified), only groups that the invoking user on the receiving side
    is a member of will be preserved. Without this option, the group is set to the default
    group of the invoking user on the receiving side...

SEE MAN rsync

Responder2

Acho que uma boa opção para você seria apenas sincronizar novamente da origem para o destino normalmente, assumindo que seja uma transferência física separada do sistema de arquivos, usando algo como

rsync -e 'ssh -p 22' -quaxz --bwlimit=1000 --del --no-W --delete-excluded --exclude-from=/excludedstufflist /sourcedir serverIP:/destinationdir

e então, quando tudo estiver copiado para o lugar certo no novo sistema, descubra quais novos UIDs seu sistema forneceu aos dados do sistema de origem. Provavelmente é 1001, 1002 etc. Nesse caso, você pode facilmente fazer um

find /destinationdir -user 1001 -exec chown username '{}' \;
find /destinationdir -user 1002 -exec chown otherusername '{}' \;
etc.

Sim, você teria que fazer a última coisa 100 vezes, mas poderia facilmente criar um script, se conhecesse a sequência UID usada durante o rsync. Fiz exatamente isso uma vez, migrando cerca de 60 usuários de um servidor para outro, e funcionou razoavelmente bem. Também precisei substituir as permissões de grupo, algo semelhante;

chown --from=oldguy newguy * -R
chown --from=:friends :family * -R

Coisas assim. Espero que você possa usar isso.

Responder3

Você não pode fazer isso em um comando. No entanto, mesmo com mais de 100 usuários, é bastante simples automatizar a tarefa, então não vejo por que você insiste que seja um comando.

Você precisapuxaros dados da máquina de destino neste cenário. Teoricamente, seria possível conduzir a transferência do servidor de origem através de um túnel rsyncatravés de um túnel reverso, ssho que seria consideravelmente mais complicado.

for testdir in /home/sub*/test1
do
    owner=$(stat -c %u "$testdir")
    rsync -avP --chown "$u" sourceserver:"$testdir"/ "$testdir"/
done

Se você não tiver o --chownsinalizador, poderá emular isso com um processo de duas etapas:

for testdir in /home/sub*/test1
do
    owner=$(stat -c %u "$testdir")
    rsync -avP --no-owner sourceserver:"$testdir"/ "$testdir"/
    chown -R "$u" "$testdir"                   # If possible
    # find "$testdir" -exec chown "$u" {} +    # Otherwise
done

Se você precisar usar a findvariante e findnão entender +, substitua-a por uma um pouco menos eficiente \;(que é ponto e vírgula de folga).

informação relacionada