La commande de départ
rsync -avz src/ user@server:/srv/app/
-acopie les dossiers et conserve les permissions, les dates et les liens.-vliste les fichiers transférés.-zcompresse pendant le transfert, ce qui aide pour du texte sur une liaison lente et apporte peu pour des fichiers déjà compressés.
Lancez-la deux fois de suite : la seconde ne liste aucun fichier. Modifiez un fichier et elle ne liste que celui-là.
Pour choisir entre les trois outils, voyez scp, SFTP ou rsync.
La barre oblique finale
Une barre oblique à la fin de la source change le résultat. Avec un dossier nommé site :
| Commande | Résultat sur le serveur |
|---|---|
rsync -a site server:www/ | www/site/index.html |
rsync -a site/ server:www/ | www/index.html |
Une barre oblique à la fin de la destination ne change rien ici.
Port ou clé personnalisés
rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/
rsync -avz -e "ssh -i ~/.ssh/id_work" src/ user@server:/srv/app/
Une entrée Host dans votre configuration SSH fonctionne aussi et est plus courte : rsync -avz src/ server:/srv/app/.
Gros fichiers : progression et reprise
rsync -aP big.bin user@server:/tmp/
-P signifie --partial --progress. Sans --partial, rsync supprime un fichier qu'il n'a pas fini de transférer. Avec cette option, le fichier partiel reste et le lancement suivant s'en sert. Nous avons interrompu un transfert de 30 Mo en cours de route. Sans --partial, aucun fichier ne restait sur le serveur. Avec, environ 4 Mo restaient, le même rsync -aP a terminé le travail, et les sommes de contrôle des deux copies correspondaient.
--dry-run et --delete
--delete supprime à destination les fichiers absents de la source. Faites toujours un aperçu avec --dry-run, ou -n :
$ rsync -avn --delete site/ server:www2/
sending incremental file list
deleting oldfile
...
total size is 9 speedup is 0.05 (DRY RUN)
Le fichier est toujours là après cela. Retirez -n pour le faire pour de bon.
Trois façons dont --delete fait mal
- Une source vide vide la destination. Un essai à blanc avec un dossier
empty/vide comme source prévoyait de tout supprimer dans la cible. Si un montage a échoué et que le dossier source est vide, c'est ce qui arrive. - Une mauvaise barre oblique supprime plus que prévu. La destination est comparée à la source telle que vous l'avez écrite : avec
sitecontrewww/, tout le reste dewww/est supprimé. - Les exclusions interagissent avec lui. Les fichiers exclus sont laissés tranquilles, sauf si vous ajoutez
--delete-excluded. Dans notre essai, cela a supprimédebug.logdu serveur.
Une limite arrête une exécution qui supprimerait trop. Elle se termine avec le code 25 :
$ rsync -a --delete --max-delete=1 empty/ server:www2/
Deletions stopped due to --max-delete limit (2 skipped)
Autres formes utiles
| Tâche | Commande |
|---|---|
| Télécharger | rsync -av server:www/ back/ |
| Ignorer des fichiers | rsync -av --exclude='*.log' site/ server:www/ |
| Voir ce qui changerait et pourquoi | rsync -ain site/ server:www/ |
| Créer les dossiers manquants sur la cible | rsync -a --mkpath site/ server:a/b/c/ |
Sans --mkpath, une cible profonde de plus d'un dossier échoue avec mkdir ... failed: No such file or directory.
Erreurs
Si rsync n'est pas installé sur le serveur, vous obtenez des messages comme ceux-ci, et la solution est de l'y installer :
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127)
Un dossier source qui n'existe pas donne change_dir ... failed: No such file or directory et le code de sortie 23.
Sur un Mac
rsync sur le Mac que nous avons utilisé est openrsync, qui indique rsync version 2.6.9 compatible. Il a géré les options de base ci-dessus, mais son aide ne mentionne ni --mkpath ni --append-verify. Si vous en avez besoin, installez un rsync plus récent avec Homebrew.
Questions
rsync par SSH a-t-il besoin de rsync sur le serveur ?
Oui. rsync tourne des deux côtés. S'il manque sur le serveur, vous obtenez remote command not found (code 127).
Comment utiliser rsync avec un autre port SSH ?
Passez la commande ssh avec -e, par exemple rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/, ou indiquez le port dans une entrée Host de ~/.ssh/config.
Que signifie la barre finale dans rsync ?
Sur la source, src/ copie le contenu du dossier et src copie le dossier lui-même. Sur la destination, cela ne change rien.