Cómo asignar arbitrariamente las propiedades de usuarios / grupos en rsync

17

Necesito sincronizar un directorio a un servidor remoto para que todos los archivos que pertenecen al usuario X y al grupo Y en la máquina de origen (local) se asignen al usuario W y al grupo Z en la máquina de destino (remota). Si es posible usando ssh como transporte, pero si necesito usar el demonio rsync, también está bien.

¿Hay una manera de hacer eso? Estoy buscando una manera de establecer un mapa arbitrario de usuarios / grupos, como

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

Este debería ser un caso de uso bastante común, ¿no? Por ejemplo, tengo archivos en mi computadora local donde mi nombre de usuario es X, y necesito cargarlos en un servidor web donde deben pertenecer a un usuario determinado que no tiene el mismo nombre o el mismo UID que mi usuario en mi computadora personal

No puedo encontrar eso en la página de manual de rsync ...

LINUX en máquinas locales y remotas (Ubuntu local, centOS remoto)

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

matteo
fuente
1
Por favor, siempre incluya su sistema operativo. Las soluciones a menudo dependen del sistema operativo utilizado. ¿Estás utilizando Windows, Linux, Unix, OSX, BSD? ¿Cual version?
Terdon

Respuestas:

21

Rsync versión 3.1.0 introdujo las opciones --usermapy --groupmapprecisamente para ese propósito. Ver la página del manual .

Michel Schinz
fuente
Esto es bueno saberlo. Definitivamente hay un escenario de caso de uso para esto. Por ejemplo, tengo dos servidores Icinga y necesito hacer una sincronización unidireccional de los archivos de configuración de maestro a esclavo. Pero icinga en el maestro es un fluido diferente que icinga en el esclavo. Entonces, es bueno saber que rsync puede manejar esto.
Michael Martinez
Notas de la versión: Ubuntu v16.04 tiene v3.1.1, CentOS 7 tiene v3.1.2, pero CentOS 6 tiene v3.0.6. Esto funciona muy bien para las nuevas distribuciones.
jimp
4

La última versión (al menos 3.1.1) de rsync le permite especificar la "propiedad remota":

--usermap=tom:www-data

Cambia la propiedad de tom a www-data (también conocido como PHP / Nginx). Si está utilizando Mac como cliente, use brew para actualizar a la última versión. Y en su servidor, descargue las fuentes de archivos, ¡luego "hágalo"!

Thomas Decaux
fuente
para mí funciona como --chown = tom: www-data
Federico Galli
0

Si desea cambiar la propiedad de los archivos a usuarios arbitrarios, primero deberá ser root en el cuadro de destino.

No creo que haya tal característica integrada por rsync, pero puede lograrlo ejecutando un finddespués de hacer su rsync.

Tal vez, un comando como este hará el truco: por ejemplo, traducir de UID 1000 => 505 y UID 1001 => 700:

find /your/rsynced/path -user 1000 -exec chown 505 {} \;
find /your/rsynced/path -user 1001 -exec chown 700 {} \;

Si tiene muchos usuarios, puede considerar usar un bucle con un mapeo, en su idioma de predilección.

Que te diviertas.

Adrien M.
fuente
Ok, entonces no hay forma de que rsync haga eso. Asombroso, me pareció una necesidad tan obvia.
matteo
1
@matteo cuidado si usas esto. Si hay un usuario con la identificación 1000 o 1001 en la máquina remota, puede haber archivos que sean legítimamente propiedad de ellos en las ubicaciones remotas y su identificación podría causar problemas.
terdon
@terdon ¿cómo habría un usuario sin nombre en la máquina remota? (porque si se muestra la ID en lugar del nombre cuando se enumeran los archivos, significa que el usuario no tiene un nombre, ¿verdad?)
matteo
1
@matteo no, cada usuario tiene una identificación de usuario y un nombre. En la mayoría de los sistemas basados ​​en Debian (y probablemente en otros), el primer usuario predeterminado es el usuario 1000. Intente ejecutar iden su máquina para ver. Por lo tanto, si usa las ID de esta manera, está asumiendo que no hay ningún usuario con la misma ID en la máquina remota y eso probablemente no sea cierto.
terdon
en mi caso no hay ningún usuario con UID 1000 en el servidor, al menos no aparece en / etc / passwd. Lo que adiviné porque cuando enumero los archivos con "ls -la", los archivos que pertenecen a 1000 (que fueron el resultado de rsync -avz de mi máquina local donde el usuario 1000 es mi usuario predeterminado "teo") aparecen con "1000 "como el dueño. Si había un usuario con esa identificación y su nombre era "Alguien", entonces el propietario de los archivos se mostraría como "Alguien" en la salida de ls, ¿verdad? De todos modos, es una advertencia útil para tener en cuenta, gracias.
matteo
-1

No estoy seguro de entender, para conectarse sshnecesita proporcionar un nombre de usuario. Ese nombre de usuario será el usuario W en la máquina remota que pertenece al grupo Z. Por lo tanto, todo se transferirá exactamente como desea que sea:

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

EDITAR en respuesta al comentario del OP.

Si desea hacer esta asignación de usuario y no perder la configuración de permisos, no la use -a. Primero, ejecute rsync con [email protected]para obtener el nombre de usuario correcto. Luego, en lugar de -ahacer que conserve la propiedad, especifique las opciones 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

Por lo tanto, -aactiva todas las opciones anteriores, pero no desea conservar el grupo o el propietario. Este comando debe hacer lo que quieras:

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

Como ahora está iniciando sesión mywwwy ya no conserva la información del propietario / grupo, las copias realizadas por rsyncpertenecerán al mywwwusuario.

terdon
fuente
No, hago rsync -avz / path / to / local [email protected]: / path / to / remote. Mi pregunta es, ¿cómo consigo que los archivos que pertenecen al usuario "x" en mi máquina local se reasignen al usuario "w" en el servidor? En mi computadora, mis archivos pertenecen a "teo". En el servidor ni siquiera hay un usuario llamado "teo", necesito que el usuario sea el que usa Apache, por ejemplo, "mywww"; y lo mismo para el grupo. De manera predeterminada, rsync intentará preservar al propietario como "teo", y dado que no existe dicho usuario, preservará el UID, lo que dará como resultado archivos que pertenecen al usuario "1000", que es un usuario inexistente en el servidor
matteo
Por cierto, al mismo tiempo necesito preservar los permisos de archivo que ya lo hace según la opción -a. Quiero decir, cualquier solución que me haga perder la capacidad de preservar los permisos de archivo (es decir, un archivo 777 sigue siendo un 777 y un 600 sigue siendo un 600) no funcionará
Matteo
@matteo es porque -ahabilita las opciones de grupo y propietario de la reserva Ver mi respuesta actualizada.
terdon
1
@matteo por favor explique lo que realmente necesita cuando hace preguntas. De esa forma no perdemos el tiempo proporcionando respuestas incompletas. La próxima vez, recuerde que i) incluya los comandos reales que utilizó (rsync no conserva nada de forma predeterminada, su uso lo -ahizo) ii) explique claramente todas las restricciones que tiene, acaba de mencionar a un solo usuario hasta su último comentario y iii ) mencione su sistema operativo. De todos modos, la forma de hacer esto rsyncsería copiar un conjunto de archivos como mywww@remotey el siguiente conjunto como root@remote.
Terdon
1
@matteo lo que realmente no estaba claro era que estaba usando lo -aque preserva la propiedad. Los ejemplos que dio sugirieron que solo necesitaba hacer esto para un usuario. De todos modos, le recomendaría que use rsync, solo haga una lista de los diferentes archivos que desea copiar para cada usuario y ejecute múltiples rsyncs que se conectan a la máquina remota con el nombre de usuario correspondiente. Eso será más simple y seguro.
terdon