Exemples courants
| Tâche | Commande |
|---|---|
| Envoyer un fichier | scp report.pdf user@server:/tmp/ |
| Télécharger un fichier | scp user@server:/tmp/report.pdf . |
| Télécharger sous un autre nom | scp user@server:/tmp/report.pdf copy.pdf |
| Envoyer un dossier | scp -r site user@server:/tmp/ |
| Télécharger le contenu d'un dossier | scp -r 'user@server:/tmp/site/*' dl/ |
| Un autre port | scp -P 2222 file user@server:/tmp/ |
| Utiliser une clé précise | scp -i ~/.ssh/id_work file user@server:/tmp/ |
| Conserver les dates et les modes | scp -p file user@server:/tmp/ |
| Limiter le débit, en Kbit/s | scp -l 800 file user@server:/tmp/ |
| Compresser | scp -C file user@server:/tmp/ |
| Via un hôte de rebond | scp -J user@jump file user@server:/tmp/ |
Une entrée Host dans ~/.ssh/config fonctionne aussi ici : scp file server:/tmp/. Voir le fichier de configuration SSH.
La ligne avec -J passe par un hôte de rebond. Pour enregistrer ce chemin une fois pour toutes, voir ProxyJump et les hôtes de rebond.
Copier deux fois un dossier l'imbrique
Si le dossier de destination existe déjà, scp -r place le dossier à l'intérieur. Avec /tmp/site déjà présent sur le serveur, cette commande nous a donné /tmp/site/site :
scp -r site user@server:/tmp/site
Ainsi, une première exécution crée /tmp/site, et une seconde crée /tmp/site/site. Pour copier un dossier à répétition, utilisez plutôt rsync.
Noms contenant des espaces
scp "my file.txt" "user@server:/tmp/my file.txt"
Cela fonctionne avec le protocole SFTP par défaut. Avec l'ancien protocole d'-O, la même ligne a échoué avec scp: ambiguous target, car le côté distant relit le nom. Dans ce cas, ajoutez une seconde paire de guillemets :
scp -O "my file.txt" 'user@server:"/tmp/my file.txt"'
Entre deux serveurs
scp -3 user@one:/tmp/file user@two:/tmp/
-3 fait passer les données par votre machine : aucun des serveurs n'a donc besoin d'un accès à l'autre. Depuis OpenSSH 8.7, c'est le comportement par défaut : l'option ne fait que le rendre explicite. Dans notre essai, une copie sans -3 passait aussi par le client local.
Pour que le premier serveur se connecte directement au second, utilisez -R :
scp -R user@one:/tmp/file user@two:/tmp/
Le premier serveur doit alors se connecter au second sans invite, et connaître déjà sa clé d'hôte. Sinon, vous obtenez Host key verification failed., ce qui est arrivé dans notre essai.
-O : l'ancien protocole
Depuis OpenSSH 9.0, scp utilise le protocole SFTP par défaut. Vous pouvez le voir avec scp -v, qui affiche Sending subsystem: sftp. Avec -O, il affiche Sending command: scp -v -t /tmp/.
scp -O file user@server:/tmp/
Il faut -O quand l'autre côté n'a pas de sous-système SFTP, comme certains équipements embarqués. L'erreur habituelle est alors subsystem request failed on channel 0. Voir le guide de cette erreur.
Ce que scp ne fait pas
- Il ne reprend pas un transfert interrompu. Relancez-le et il repart de zéro.
- Il n'envoie pas seulement ce qui a changé.
Pour cela, utilisez rsync, ou reget dans sftp. Pour une comparaison complète, lisez scp, SFTP ou rsync.
Questions
Comment copier un dossier avec scp ?
Ajoutez -r : scp -r dossier user@server:/tmp/. Si le dossier de destination existe déjà, scp place le dossier à l'intérieur.
Comment utiliser scp avec un autre port ?
Avec -P majuscule, par exemple scp -P 2222 file user@server:/tmp/. Le -p minuscule conserve les dates et les droits des fichiers.
scp peut-il reprendre un transfert interrompu ?
Non. Relancé, il recommence le fichier depuis le début. Utilisez rsync avec --partial, ou reget et reput dans sftp.