rsync y permisos de escritura en el destino

8

Siempre me pregunté por qué rsyncintenta transferir un archivo a una ubicación remota donde tiene permisos de lectura / ejecución para el directorio de destino, pero no tiene permisos de escritura para crear el archivo de destino real. Esto se puede simular incluso localmente cuando se intenta copiar un archivo como un usuario normal a / , rsynctransferirá todo el archivo (también tarda bastante en archivos grandes) y finalmente falla con

rsync: mkstemp "/.myTargetFile" failed: Permission denied (13)

Por lo tanto, ya parece fallar en el inicio al intentar crear el archivo temporal (el archivo de puntos ) durante la transferencia. ¿Por qué no se da cuenta de esto y aborta temprano en lugar de intentar copiar todo el archivo sin tener permisos de escritura?

¿Y a dónde copia el archivo si no puede crear el archivo temporal? No puedo ver ningún aumento de memoria de los procesos rsync y tampoco ningún archivo correspondiente en / tmp . Parece que descarta directamente los datos en el destino, pero aún continúa con la transferencia.

scai
fuente

Respuestas:

5

Si necesita copiar en un directorio sin permiso de escritura, agréguelo --inplacea las opciones de comando. Esto a veces es más barato que no crea una copia temporal, pero durante la actualización el archivo está en estado inconsistente.

Sobre la pregunta de por qué no verifica los derechos propios de antemano: podría perder algunos detalles adicionales como las ACL de acceso extendido, por lo que rsync no cree en el esquema estándar 3 * 3 + 3. OTOH, esta política intencional no hace una diferencia real en el resultado, de todos modos el archivo no se actualiza.

Netch
fuente
Gracias por su respuesta, pero es una suposición vaga y realmente no responde a mi pregunta. Incluso con --inplaceél, transfiere todo el archivo hasta notar la falta de permisos de escritura.
scai
1
Si bien esto no responde a la ayuda de OP, el uso --inplacees muy útil cuando tiene derechos para escribir en un archivo pero no en el directorio que lo contiene.
tokland
pero esa fue mi solución (tenía archivos tmp generados pero no renombrados con el nombre original), así que gracias y hasta
roothahn
4

Esto parece ser una deficiencia del protocolo rsync actual como se explica en el rastreador de errores . El protocolo rsync no puede determinar de antemano si tiene permisos de escritura en el destino. En cambio, solo envía y comprueba el éxito o el fracaso después.

scai
fuente
2

Rsync crea un archivo temporal en la misma carpeta del archivo de destino, por lo que, en este caso, debe copiar algunos archivos /, ya que no lo inició como root y normalmente /solo se pudo escribir por root, por lo que falla.

Para saber qué archivos se están copiando, pase el parámetro -v

margarita
fuente
1
Sé que rsynccrea sus archivos temporales en la misma carpeta que el directorio de destino. Pero incluso si no puede crear esos archivos temporales, aún así comienza la transferencia y falla después, en lugar de verificar al principio si tiene todos los permisos de escritura requeridos. Quiero saber por qué se comporta así.
scai