rsync et autorisations d'écriture sur la cible

8

Je me suis toujours demandé pourquoi rsyncessayait de transférer un fichier vers un emplacement distant où il avait des autorisations de lecture / exécution pour le répertoire cible, mais aucune autorisation d' écriture pour créer le fichier de destination réel. Cela peut être simulé même localement lorsque vous essayez de copier un fichier en tant qu'utilisateur normal vers / , rsynctransférera le fichier entier (prenant également assez de temps pour les fichiers volumineux) et échoue finalement avec

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

Il semble donc déjà échouer au démarrage lors de la tentative de création du fichier temporaire (le fichier de points ) lors du transfert. Pourquoi ne le remarque-t-il pas et abandonne-t-il tôt au lieu d'essayer de copier le fichier entier sans avoir aucune autorisation d'écriture?

Et où copie-t-il le fichier s'il ne peut pas créer le fichier temporaire? Je ne vois aucune augmentation de mémoire des processus rsync et aucun fichier correspondant dans / tmp . On dirait qu'il rejette directement les données à destination mais continue toujours le transfert.

scai
la source

Réponses:

5

Si vous devez copier dans un répertoire sans autorisation d'écriture, ajoutez --inplaceaux options de commande. C'est parfois moins cher qu'il ne crée pas de copie temporaire, mais lors de la mise à jour, le fichier est dans un état incohérent.

Sur la question de savoir pourquoi il ne vérifie pas ses propres droits au préalable: il pourrait manquer des détails supplémentaires en tant que listes de contrôle d'accès étendues, donc rsync ne croit pas au schéma 3 * 3 + 3 standard. OTOH cette politique intentionnelle ne fait aucune différence réelle dans le résultat - de toute façon le fichier n'est pas mis à jour.

Netch
la source
Merci pour votre réponse, mais ce n'est qu'une vague supposition et ne répond pas vraiment à ma question. Même avec, --inplaceil transfère tout le fichier jusqu'à ce qu'il remarque le manque d'autorisations d'écriture.
scai
1
Bien que cela ne réponde pas à l'aide de OP, l'utilisation --inplaceest très utile lorsque vous avez le droit d'écrire dans un fichier mais pas dans le répertoire contenant.
Tokland
mais c'était ma solution (j'avais des fichiers tmp générés mais pas renommés au nom d'origine), donc merci et plus
roothahn
4

Cela semble être une lacune du protocole rsync actuel, comme expliqué dans le suivi des bogues . Le protocole rsync ne peut pas déterminer à l'avance s'il dispose d'autorisations d'écriture sur la cible. Au lieu de cela, il envoie et vérifie le succès ou l'échec par la suite.

scai
la source
2

Rsync crée un fichier temporaire dans le même dossier que le fichier cible, donc dans ce cas, vous devez copier certains fichiers dans la /mesure où vous ne l'avez pas lancé en tant que root et qui /n'était normalement accessible en écriture que par root, il échoue donc.

Pour savoir quels fichiers sont copiés, passez le paramètre -v

Marguerite
la source
1
Je sais que rsynccrée ses fichiers temporaires dans le même dossier que le répertoire cible. Mais même s'il ne peut pas créer ces fichiers temporaires, il démarre le transfert et échoue ensuite au lieu de vérifier dès le début s'il dispose de toutes les autorisations d'écriture requises. Je veux savoir pourquoi ça se comporte comme ça.
scai