Côte à côte
| scp | sftp | rsync | |
|---|---|---|---|
| Idéal pour | Une copie rapide | Parcourir, comptes restreints | Synchroniser des dossiers, gros fichiers |
| Prérequis sur le serveur | SSH avec le sous-système SFTP, ou scp avec -O | SSH avec le sous-système SFTP | SSH et rsync installé |
| N'envoie que les changements | Non | Non | Oui |
| Reprise | Non | Oui, reget et reput | Oui, --partial |
| Option de port | -P 2222 | -P 2222 | -e 'ssh -p 2222' |
scp
scp file.txt user@server:/tmp/
scp -r folder user@server:/tmp/
scp -P 2222 user@server:/var/log/app.log .
Depuis OpenSSH 9.0, scp utilise le protocole SFTP et non l'ancien protocole scp. Vous pouvez le voir avec scp -v, qui affiche Sending subsystem: sftp. Le gain pratique est que les noms de fichiers contenant des espaces ou des caractères spéciaux n'ont plus besoin d'un double jeu de guillemets.
Si le serveur n'a pas de sous-système SFTP, la copie échoue avec subsystem request failed on channel 0. Ajoutez -O pour utiliser l'ancien protocole :
scp -O file.txt user@server:/tmp/
D'autres cas, comme les dossiers, un autre port et deux serveurs, sont dans les exemples de scp.
sftp
sftp user@server ouvre un petit shell avec ls, cd, get, put et bye. Il fonctionne sur des comptes sans shell : c'est donc le choix habituel pour les utilisateurs restreints. Voir la configuration d'un utilisateur limité à sftp.
Toutes les commandes de l'invite sont dans la liste des commandes sftp.
Il peut reprendre un transfert. Dans sftp, ces commandes continuent un fichier partiel :
reput big.bin /tmp/big.bin
reget /tmp/big.bin big.bin
Dans notre essai, les deux ont terminé à partir d'un fichier partiel, et les sommes de contrôle correspondaient à l'original. Pour les scripts, placez les commandes dans un fichier et lancez sftp -b commands.txt user@server.
rsync
rsync -av src/ user@server:/srv/app/
rsync -avz -e 'ssh -p 2222' src/ user@server:/srv/app/
rsync -aP big.bin user@server:/tmp/
-a conserve les permissions, les dates et les liens, et copie les dossiers. -v liste les fichiers. -z compresse, ce qui aide pour du texte sur des liaisons lentes. -P signifie --partial --progress.
rsync doit exister des deux côtés. S'il manque sur le serveur, vous obtenez :
bash: line 1: rsync: command not found
La barre oblique finale
Une barre oblique à la fin de la source change le résultat. Nous avons exécuté les deux formes sur un dossier src contenant a.txt :
rsync -a src user@server:/tmp/noslash/ # creates /tmp/noslash/src/a.txt
rsync -a src/ user@server:/tmp/slash/ # creates /tmp/slash/a.txt
Avec la barre oblique, rsync copie le contenu du dossier. Sans elle, il copie le dossier lui-même. Une barre oblique sur la destination ne change rien.
N'envoyer que ce qui a changé
Dans notre essai, un fichier de 50 Mio a été envoyé une fois, puis 4 Kio en son milieu ont été modifiés :
- Premier transfert : 52 441 699 octets envoyés.
- Second transfert : 43 547 octets envoyés.
Cette économie se produit à travers un réseau. Entre deux dossiers d'une même machine, rsync a recopié tout le fichier dans notre essai.
Reprendre un transfert
Nous avons interrompu un transfert de ce fichier avec --partial, ce qui a laissé 15,4 Mo à destination. En relançant la même commande, ces octets ont été réutilisés et le reste a été envoyé, et cmp a trouvé le résultat identique à l'original. Sans --partial, rsync supprime le fichier partiel quand il est interrompu.
Deux pièges
- rsync peut ignorer un fichier modifié. Par défaut, il ne compare que la taille et la date de modification. Dans notre premier essai, la modification de 4 Kio est tombée dans la même seconde que la copie précédente, avec la même taille, et rsync n'a rien envoyé.
-ccompare les sommes de contrôle, au prix de la lecture de chaque fichier. --deletesupprime à destination les fichiers absents de la source. Avec un mauvais chemin, cela peut faire beaucoup de fichiers. Ajoutez d'abord-npour voir la liste :rsync -avn --delete src/ user@server:/srv/app/.
Sur un macOS récent, /usr/bin/rsync peut être openrsync et non l'original : sur notre Mac de test, rsync --version affichait openrsync: protocol version 29. Les options ci-dessus ont fonctionné, mais il n'a pas tout : si une option est refusée, vérifiez la sortie de rsync --version.
Lequel choisir
- Un fichier, une fois :
scp. - Vous devez d'abord regarder autour de vous, ou le compte n'autorise que SFTP :
sftp. - Le même dossier à recopier régulièrement, ou un gros fichier sur une mauvaise connexion :
rsync. - Votre éditeur et vos outils locaux sur les fichiers du serveur : montez le dossier avec sshfs.
Les trois lisent votre configuration SSH : une entrée Host mémorise donc le port et l'utilisateur. Voir le fichier de configuration SSH.
Questions
SFTP et scp, c'est la même chose ?
Non. sftp est un client interactif pour parcourir et transférer des fichiers, scp une commande de copie en une ligne. Depuis OpenSSH 9.0, scp utilise le protocole SFTP en dessous.
rsync est-il plus rapide que scp ?
Quand la destination a déjà une ancienne copie, oui : rsync n'envoie que les parties modifiées. Dans notre test, une modification de 4 Kio dans un fichier de 50 Mio a envoyé environ 43 Ko. Pour un nouveau fichier, les deux envoient tout le fichier.
rsync fonctionne-t-il via SSH ?
Oui. Pour un chemin distant, rsync se connecte avec ssh par défaut, mais rsync doit aussi être installé sur le serveur.
Sources
- Notes de version d'OpenSSH 9.0
- scp(1), manuel OpenBSD
- sftp(1), manuel OpenBSD
- Manuel de rsync(1)
- Comment fonctionne rsync