El servidor de origen tiene un propietario que es root.
----/home/sub1/test1
----/home/sub2/test1
Mi máquina local es el destino.
----/home/sub1/test1 owner by user1
----/home/sub2/test1 owner by user2
¿Cómo puedo sincronizar un nuevo archivo de actualización del servidor de origen con la máquina local y no cambiar el propietario local?
Editar
Necesito sincronizar todas las fuentes en un solo comando porque tengo muchas carpetas y la máquina local también tiene muchos propietarios. ¿Puede ser posible?
Gracias.
Respuesta1
Parece que no quieres que cambien después de la transferencia.
Pruebe el siguiente comando:
rsync -avr -o -g /source/directory user@:destinationHost/destination/directory
Si no utiliza estas opciones, el usuario y el grupo se cambiarán al usuario que invoca en el extremo receptor. Si desea especificar algún otro usuario, deberá agregar un comando chown a su secuencia de comandos.
-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
Respuesta2
Creo que una buena opción para usted podría ser simplemente realizar rsync desde el origen al destino normalmente, asumiendo que se trata de una transferencia física separada del sistema de archivos, usando algo como
rsync -e 'ssh -p 22' -quaxz --bwlimit=1000 --del --no-W --delete-excluded --exclude-from=/excludedstufflist /sourcedir serverIP:/destinationdir
y luego, cuando todo esté copiado en el lugar correcto en el nuevo sistema, descubra qué nuevos UID proporcionó su sistema a los datos del sistema fuente. Probablemente sea 1001, 1002, etc. En cuyo caso puedes hacer fácilmente una
find /destinationdir -user 1001 -exec chown username '{}' \;
find /destinationdir -user 1002 -exec chown otherusername '{}' \;
etc.
Sí, tendrías que hacer eso último 100 veces, pero podrías escribirlo fácilmente si conoces la secuencia UID utilizada durante rsync. He hecho exactamente esto una vez, migrando alrededor de 60 usuarios de un servidor a otro. y funcionó razonablemente bien. También necesitaba reemplazar los permisos de grupo, trato similar;
chown --from=oldguy newguy * -R
chown --from=:friends :family * -R
Cosas como esas. Espero que puedas usar esto.
Respuesta3
No puedes hacer esto con un solo comando. Sin embargo, incluso con más de 100 usuarios es bastante sencillo automatizar la tarea, así que no veo por qué insistes en que tiene que ser un solo comando.
Necesitasjalarlos datos de la máquina de destino en este escenario. En teoría, sería posible impulsar la transferencia desde el servidor de origen mediante un túnel rsync
a través de un túnel inverso, ssh
lo que sería considerablemente más complicado.
for testdir in /home/sub*/test1
do
owner=$(stat -c %u "$testdir")
rsync -avP --chown "$u" sourceserver:"$testdir"/ "$testdir"/
done
Si no tienes la --chown
bandera, puedes emularla con un proceso de dos pasos:
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
Si necesita usar la find
variante y find
no la entiende +
, reemplácela con la variante ligeramente menos eficiente \;
(es decir, punto y coma de reacción).