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 rsync
através de um túnel reverso, ssh
o 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 --chown
sinalizador, 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 find
variante e find
não entender +
, substitua-a por uma um pouco menos eficiente \;
(que é ponto e vírgula de folga).