Aller au contenu
Administration Linux medium

Transférer des fichiers avec SCP

21 min de lecture

Quand on déploie une configuration sur un serveur, récupère des logs ou transfère un fichier rapidement entre deux machines, scp (Secure Copy Protocol) est l'outil le plus direct. Il utilise SSH pour chiffrer le transfert de bout en bout : une seule commande, pas de serveur FTP à configurer. Pour les transferts ponctuels et rapides, scp reste imbattable en simplicité.

  • Copier un fichier vers ou depuis un serveur distant
  • Transférer un répertoire complet avec -r
  • Utiliser un port SSH personnalisé avec -P (majuscule)
  • Connaître la différence entre -p et -P
  • Identifier quand préférer rsync à scp

scp fait partie des outils de transfert de fichiers sous Linux. Chaque outil a sa spécialité :

CommandeSpécialitéQuand l'utiliser
scpCopie distante via SSHTransfert rapide one-shot
rsyncSynchronisation intelligente (delta)Sauvegardes, gros fichiers, reprise
sftpTransfert interactif via SSHNavigation distante, sessions prolongées
tar + sshArchivage + transfertArbres de fichiers avec permissions complexes
curl / wgetTéléchargement HTTP/FTPRécupérer depuis le web

Quand utiliser scp plutôt que les autres :

SituationMeilleur outilPourquoi
Copier un fichier unique vers un serveurscpPlus simple que rsync pour un seul fichier
Sauvegarder un dossier régulièrementrsyncNe transfère que les différences
Transfert coupé en coursrsync -Pscp recommence à zéro
Transférer un fichier très volumineuxrsyncReprise possible, bande passante contrôlée
Récupérer un log rapidementscpUne seule commande, rapide
Synchronisation bi-directionnelleunisonrsync et scp sont unidirectionnels

🧠 Modèle mental — Comment fonctionne scp

scp = Source → [Tunnel SSH chiffré] → Destination

Modèle mental scp : la source (locale ou distante) est chiffrée via SSH et copiée vers la destination

Points clés

  • scp copie des fichiers à travers un tunnel SSH chiffré
  • La syntaxe user@host:chemin désigne un emplacement distant
  • Sans -r, scp ne copie que des fichiers (pas de dossiers)
  • -P (majuscule) pour le port, -p (minuscule) pour préserver les permissions
  • Aucune reprise de transfert possible : si ça coupe, on recommence
  • Pour des transferts réguliers, préférer rsync à scp

Règles d'or

1
Utiliser des clés SSH plutôt que des mots de passe Plus sécurisé et permet l'automatisation sans interaction.
2
Préférer rsync pour les transferts volumineux ou récurrents rsync reprend les transferts interrompus et ne transfère que les différences.

Vocabulaire essentiel

-r
Récursif : copie les dossiers et leur contenu
-P (majuscule)
Spécifier le port SSH (attention : majuscule !)
-p (minuscule)
Préserver permissions et dates
-C
Activer la compression pendant le transfert
-q
Mode silencieux (pas de barre de progression)
-v
Mode verbeux (détails de connexion SSH)
📚 Pour aller plus loin — 6 options avancées
-l
Limiter la bande passante (en Kbit/s)
-3
Transfert entre 2 serveurs via la machine locale
-i
Spécifier un fichier de clé privée SSH
-o
Passer des options SSH (StrictHostKeyChecking, etc.)
-F
Utiliser un fichier de config SSH alternatif
-c
Choisir l'algorithme de chiffrement

Le principe est simple : scp prend un fichier source (local ou distant), le fait passer à travers un tunnel SSH chiffré, et le dépose à la destination (locale ou distante). C'est exactement comme cp, mais à travers le réseau et de manière sécurisée.

Fenêtre de terminal
scp [OPTIONS] SOURCE DESTINATION
ScénarioSyntaxeExemple
Local → Distantscp fichier user@srv:/dest/scp config.conf admin@web-01:/etc/nginx/
Distant → Localscp user@srv:/fichier /local/scp admin@web-01:/var/log/app.log ~/logs/
Distant → Distantscp -3 user1@srv1:/f user2@srv2:/dest/scp -3 admin@web-01:/log admin@backup:/logs/

C'est la source d'erreur n°1 avec scp :

OptionSignificationExemple
-p (minuscule)Préserve les permissions et datesscp -p script.sh user@srv:/opt/
-P (majuscule)Port SSH personnaliséscp -P 2222 fichier user@srv:/tmp/

Astuce mnémotechnique : Port = Pmajuscule, permissions = pminuscule.

Fenêtre de terminal
# ❌ ERREUR FRÉQUENTE : -p au lieu de -P pour le port
scp -p 2222 fichier.txt user@serveur:/tmp/
# → Ne change pas le port, préserve les permissions et essaie de copier "2222" !
# ✅ CORRECT : -P (majuscule) pour le port
scp -P 2222 fichier.txt user@serveur:/tmp/
OptionSignificationUsage
-rRécursifCopier un dossier complet
-P <port>Port SSHServeur SSH sur port non standard
-pPréserverConserver permissions et dates
-CCompressionAccélérer sur connexions lentes
-vVerboseDébugger les problèmes SSH
-qQuietPas de barre de progression
-l <Kbit/s>LimiterContrôler la bande passante
-i <clé>IdentityUtiliser une clé SSH spécifique

La combo standard :

Fenêtre de terminal
# Envoi simple vers un serveur
scp config.conf admin@web-01:/etc/nginx/
# Dossier complet avec compression et port personnalisé
scp -r -C -P 2222 ~/projet/ deployer@prod:/var/www/app/
# Récupérer des logs avec préservation des dates
scp -p admin@web-01:/var/log/app.log ~/logs/

Par défaut, scp ne copie que les fichiers simples. Pour copier un dossier avec tout son contenu, l'option -r (récursif) est obligatoire :

Fenêtre de terminal
# ❌ ERREUR : scp refuse de copier un dossier sans -r
scp dossier/ user@serveur:/tmp/
# → "not a regular file"
# ✅ CORRECT : -r pour récursif
scp -r dossier/ user@serveur:/tmp/

L'option -3 permet de copier un fichier d'un serveur à un autre en passant par votre machine locale comme relais :

Fenêtre de terminal
# Copie logs de web-01 vers backup-01, via votre machine
scp -3 admin@web-01:/var/log/app.log admin@backup-01:/logs/

Sans -3, scp tente une connexion directe entre les deux serveurs (qui doit être autorisée).

Pour les transferts automatisés (scripts, CI/CD), utilisez une clé dédiée :

Fenêtre de terminal
# Clé SSH spécifique
scp -i ~/.ssh/deploy_key app.tar.gz deployer@prod:/releases/
# Combiné avec port personnalisé
scp -i ~/.ssh/deploy_key -P 2222 app.tar.gz deployer@prod:/releases/

Sur les connexions lentes ou pour les fichiers texte volumineux, la compression accélère le transfert :

Fenêtre de terminal
# Compression activée
scp -C database-dump.sql admin@backup:/dumps/
# Limiter la bande passante (en Kbit/s, pas Ko/s !)
scp -l 800 gros-fichier.iso user@serveur:/data/
# 800 Kbit/s ≈ 100 Ko/s
  • Utiliser des clés SSH plutôt que des mots de passe pour l'automatisation
  • Vérifier les permissions après transfert : ssh user@srv "ls -la /chemin/"
  • Préférer un compte non-root pour les transferts, puis déplacer avec sudo si nécessaire
  • Surveiller les connexions : sudo journalctl -u ssh

scp est idéal pour les transferts ponctuels. Mais pour certains cas, rsync est meilleur :

Critèrescprsync
Reprise de transfert❌ Recommence à zéro✅ Reprend où il s'est arrêté
Transfert delta❌ Copie tout✅ Ne copie que les changements
Exclusion de fichiers❌ Impossible--exclude
Dry-run❌ Impossible-n pour tester
Simplicité✅ Plus simple⚠️ Plus d'options à connaître
Disponibilité✅ Partout⚠️ Pas toujours installé

Règle simple : transfert ponctuel → scp. Transfert récurrent ou volumineux → rsync.

Maintenant que vous maîtrisez les bases, voici des recettes prêtes à l'emploi pour les cas fréquents. Chacune associe une formule générique et un exemple concret à adapter.

Le cas le plus courant : envoyer un fichier vers un serveur.

Fenêtre de terminal
# Formule
scp <fichier> user@serveur:<destination>/
# Exemple
scp config.conf admin@web-01:/etc/nginx/
  • <fichier> : chemin du fichier local à envoyer.
  • user@serveur : identifiant et adresse du serveur cible.
  • <destination> : chemin de dépôt sur le serveur.

L'opération inverse : récupérer un fichier depuis un serveur.

Fenêtre de terminal
# Formule
scp user@serveur:<fichier> <destination>/
# Exemple
scp admin@web-01:/var/log/nginx/error.log ~/logs/
  • user@serveur:<fichier> : la source distante.
  • <destination> : le dossier local qui reçoit le fichier.

Copier un répertoire entier avec tout son contenu.

Fenêtre de terminal
# Formule
scp -r <dossier>/ user@serveur:<destination>/
# Exemple
scp -r ~/projet/ deployer@prod:/var/www/app/
  • -r : active la copie récursive, obligatoire pour les dossiers.

Transférer quand le serveur SSH n'écoute pas sur le port 22.

Fenêtre de terminal
# Formule
scp -P <port> <fichier> user@serveur:<destination>/
# Exemple
scp -P 2222 backup.tar.gz admin@srv:/backups/
  • -P : port SSH — attention, majuscule.

Copier un fichier d'un serveur à un autre en passant par la machine locale.

Fenêtre de terminal
# Formule
scp -3 user1@srv1:<fichier> user2@srv2:<destination>/
# Exemple
scp -3 admin@web-01:/var/log/app.log admin@backup-01:/logs/
  • -3 : fait transiter les données par la machine locale comme relais.

Conserver les permissions et dates d'origine du fichier — indispensable pour les scripts exécutables.

Fenêtre de terminal
# Formule
scp -p <fichier> user@serveur:<destination>/
# Exemple
scp -p deploy.sh admin@prod:/opt/scripts/
  • -p : préserve permissions, date de modification et date d'accès.

Accélérer le transfert sur les connexions lentes, particulièrement efficace pour le texte.

Fenêtre de terminal
# Formule
scp -C <fichier> user@serveur:<destination>/
# Exemple
scp -C database-dump.sql admin@backup:/dumps/
  • -C : active la compression pendant le transfert.

Utiliser une clé SSH dédiée au transfert, typiquement pour l'automatisation.

Fenêtre de terminal
# Formule
scp -i <clé> <fichier> user@serveur:<destination>/
# Exemple
scp -i ~/.ssh/deploy_key app.tar.gz deployer@prod:/releases/
  • -i : chemin vers la clé privée SSH à utiliser.

Ces erreurs reviennent constamment avec scp. Les connaître évite des transferts ratés et des fichiers écrasés par erreur.

Fenêtre de terminal
scp -p 2222 fichier.txt user@serveur:/tmp/

Symptôme : le port est ignoré, ou scp tente de copier un fichier nommé 2222.

Cause : -p (minuscule) préserve les permissions ; -P (majuscule) change le port SSH. Moyen mnémotechnique : Port = P majuscule.

Fenêtre de terminal
scp -P 2222 fichier.txt user@serveur:/tmp/
Fenêtre de terminal
scp dossier/ user@serveur:/tmp/

Symptôme : erreur not a regular file, rien n'est copié.

Cause : par défaut, scp ne copie que les fichiers simples, jamais les dossiers.

Fenêtre de terminal
scp -r dossier/ user@serveur:/tmp/
Fenêtre de terminal
scp gros-fichier.iso user@serveur:/data/ # coupure réseau

Symptôme : après une coupure, le transfert recommence à zéro.

Cause : scp ne supporte pas la reprise de transfert, contrairement à rsync.

Fenêtre de terminal
rsync -avP gros-fichier.iso user@serveur:/data/
Fenêtre de terminal
scp user@serveur:/home/user/Mon Dossier/file.txt .

Symptôme : erreur ou fichier introuvable.

Cause : le shell interprète l'espace comme un séparateur d'arguments.

Fenêtre de terminal
scp "user@serveur:/home/user/Mon\ Dossier/file.txt" .
Fenêtre de terminal
scp user@serveur:/config/new.conf ~/config/important.conf

Symptôme : le fichier local est écrasé sans aucun avertissement.

Cause : scp écrase la destination sans demander confirmation.

Fenêtre de terminal
cp ~/config/important.conf ~/config/important.conf.bak && scp user@serveur:/config/new.conf ~/config/important.conf
Fenêtre de terminal
scp -l 100 fichier user@srv:/tmp/ # en pensant limiter à 100 Ko/s

Symptôme : transfert beaucoup plus lent que prévu, autour de 12,5 Ko/s.

Cause : -l s'exprime en Kbit/s ; 100 Kbit/s valent seulement ~12,5 Ko/s.

Fenêtre de terminal
scp -l 800 fichier user@srv:/tmp/ # 800 Kbit/s ≈ 100 Ko/s

Ce lab vous fait manipuler scp sur des fichiers réalistes, de l'envoi simple à la limitation de bande passante. Comptez 15 minutes.

Le script suivant crée des fichiers de test représentatifs d'une administration serveur :

Fenêtre de terminal
# Créer le lab
mkdir -p ~/scp-lab/{local,received}
cd ~/scp-lab/local
# Fichier de configuration typique
cat > config.conf << 'EOF'
# Configuration nginx
server {
listen 80;
server_name example.com;
root /var/www/html;
}
EOF
# Script de déploiement
cat > deploy.sh << 'EOF'
#!/bin/bash
echo "Déploiement en cours..."
systemctl restart nginx
echo "Déploiement terminé."
EOF
chmod +x deploy.sh
# Fichier de logs
for i in $(seq 1 50); do
echo "$(date -d "$i hours ago" '+%Y-%m-%d %H:%M:%S') INFO Événement $i" >> app.log
done
# Dossier avec sous-dossiers
mkdir -p projet/{src,docs,tests}
echo "print('hello')" > projet/src/main.py
echo "# Documentation" > projet/docs/README.md
echo "def test(): pass" > projet/tests/test_main.py
echo "Lab créé dans ~/scp-lab"
ls -laR ~/scp-lab/local

Pour tout nettoyer à la fin : rm -rf ~/scp-lab.

  1. Copier un fichier vers un serveur — envoyez config.conf dans /tmp/ distant : scp ~/scp-lab/local/config.conf user@serveur:/tmp/. La syntaxe user@serveur:/chemin désigne la destination distante ; tout passe par SSH.

  2. Récupérer un fichier depuis un serveur — rapatriez /etc/hostname : scp user@serveur:/etc/hostname ~/scp-lab/received/. On inverse source et destination : le serveur devient la source.

  3. Copier un dossier complet — envoyez projet/ avec -r : scp -r ~/scp-lab/local/projet user@serveur:/tmp/. Sans -r, scp refuse de copier un dossier.

  4. Utiliser un port SSH personnalisé — pour un serveur sur le port 2222 : scp -P 2222 ~/scp-lab/local/deploy.sh user@serveur:/tmp/. Attention, c'est -P majuscule.

  5. Préserver les permissions — copiez deploy.sh en conservant le bit exécutable : scp -p ~/scp-lab/local/deploy.sh user@serveur:/tmp/. -p minuscule préserve permissions et dates.

  6. Transfert avec compression — envoyez app.log compressé : scp -C ~/scp-lab/local/app.log user@serveur:/tmp/. -C accélère le transfert des fichiers texte.

  7. Mode verbeux pour le debug — observez la négociation SSH : scp -v ~/scp-lab/local/config.conf user@serveur:/tmp/. -v affiche authentification, algorithmes et erreurs détaillées.

  8. Limiter la bande passante — plafonnez le débit à 800 Kbit/s : scp -l 800 ~/scp-lab/local/app.log user@serveur:/tmp/. Soit environ 100 Ko/s.

Ces exercices vont du premier transfert au diagnostic d'un échec. Lisez l'énoncé, cherchez la commande, puis dépliez la solution.

Exercice 1 — Premier transfert. Envoyez le fichier config.conf vers le serveur web-01 dans /tmp/.

Indice : syntaxe scp fichier user@serveur:/chemin/.

Voir la solution
Fenêtre de terminal
scp config.conf admin@web-01:/tmp/

La syntaxe de base de scp : fichier local en premier, destination distante en second.

Exercice 2 — Récupération de logs. Récupérez le fichier /var/log/syslog du serveur web-01 vers ~/logs/.

Indice : la source distante vient en premier.

Voir la solution
Fenêtre de terminal
scp admin@web-01:/var/log/syslog ~/logs/

Pour récupérer un fichier, la source distante est le premier argument, la destination locale le second.

Exercice 3 — Transfert de dossier. Envoyez tout le dossier ~/projet/ vers /var/www/ sur le serveur prod.

Indice : -r est obligatoire pour les dossiers.

Voir la solution
Fenêtre de terminal
scp -r ~/projet/ deployer@prod:/var/www/

Sans -r, scp refuse de copier un dossier — c'est l'erreur la plus fréquente.

Exercice 4 — Port SSH non standard. Envoyez backup.tar.gz vers un serveur qui utilise le port SSH 2222.

Indice : -P (majuscule) pour le port SSH.

Voir la solution
Fenêtre de terminal
scp -P 2222 backup.tar.gz admin@srv:/backups/

Attention à la casse : -P majuscule = port, -p minuscule = permissions.

Exercice 5 — Transfert avec préservation. Envoyez un script en préservant ses permissions d'exécution.

Indice : -p préserve les permissions et dates.

Voir la solution
Fenêtre de terminal
scp -p deploy.sh admin@prod:/opt/scripts/

-p préserve les dates de modification et les permissions, dont le bit exécutable.

Exercice 6 — Transfert entre deux serveurs. Copiez /var/log/app.log depuis web-01 vers backup-01 en passant par votre machine.

Indice : -3 utilise votre machine comme relais.

Voir la solution
Fenêtre de terminal
scp -3 admin@web-01:/var/log/app.log admin@backup-01:/logs/

-3 fait transiter les données par la machine locale. Sans -3, la connexion serait directe entre les deux serveurs.

Exercice 7 — Options combinées. Envoyez un dossier avec compression, port 2222 et préservation des permissions.

Indice : les options scp se combinent librement.

Voir la solution
Fenêtre de terminal
scp -r -C -P 2222 -p ~/projet/ admin@srv:/var/www/

-r -C -P 2222 -p couvre la plupart des besoins d'un transfert un peu exigeant.

Exercice 8 — Debug d'un transfert échoué. Diagnostiquez un transfert qui échoue en affichant les détails SSH.

Indice : -v affiche les détails de connexion SSH.

Voir la solution
Fenêtre de terminal
scp -v config.conf admin@srv:/tmp/

-v montre la négociation SSH : authentification, algorithmes et erreurs détaillées.

Quand un transfert échoue, ces méthodes de diagnostic et ces erreurs fréquentes couvrent la grande majorité des cas.

Fenêtre de terminal
# Mode verbeux : tous les détails SSH et du transfert
scp -v fichier.txt user@serveur:/tmp/
# Tester la connexion SSH avant scp
ssh -v user@serveur "echo OK"
# Vérifier que le port SSH est ouvert
nc -zv serveur 22
# Tester avec un petit fichier pour isoler un problème de taille
echo "test" | ssh user@serveur "cat > /tmp/test.txt"
ErreurCause probableSolution
Permission deniedPas de droits d'écriture, ou dossier destination inexistantAjuster les permissions ou copier vers un dossier autorisé (/tmp/)
connect to host ... port 22: Connection refusedsshd arrêté, pare-feu, ou port différentDémarrer sshd, ouvrir le port, ou utiliser -P <port>
REMOTE HOST IDENTIFICATION HAS CHANGED!Serveur réinstallé, ou attaque MITM (rare)Vérifier avec l'admin, puis ssh-keygen -R serveur et reconnexion
not a regular fileCopie d'un dossier sans l'option -rAjouter -r pour copier récursivement
No space left on deviceDisque destination plein ou quota atteintVérifier avec ssh user@serveur "df -h", libérer de l'espace

À garder sous la main : la syntaxe générale et les options les plus utilisées au quotidien.

SyntaxeSignificationExemple
scp fichier user@host:/chemin/Envoyer un fichierscp app.conf admin@srv:/etc/
scp user@host:/chemin/fichier .Récupérer un fichierscp admin@srv:/var/log/app.log .
scp -3 user1@srv1:f user2@srv2:/Transfert inter-serveursscp -3 a@s1:/log b@s2:/log/
SyntaxeSignificationExemple
-rCopie récursive (dossiers)scp -r dossier/ user@srv:/tmp/
-P <port>Port SSH (majuscule)scp -P 2222 f.txt user@srv:/
-pPréserve permissions et datesscp -p script.sh user@srv:/
-CActive la compressionscp -C dump.sql user@srv:/
-vMode verbeux (debug)scp -v f.txt user@srv:/
-qMode silencieuxscp -q f.txt user@srv:/
-l <Kbit/s>Limite la bande passantescp -l 800 f user@srv:/
-i <clé>Clé SSH privéescp -i ~/.ssh/key f user@srv:/
-o <option>Option SSH ponctuellescp -o StrictHostKeyChecking=no f srv:/
-c <algo>Algorithme de chiffrementscp -c aes256-ctr f user@srv:/

Vous maîtrisez scp quand vous pouvez cocher chacun de ces points sans hésiter :

  • Je sais envoyer un fichier vers un serveur distant.
  • Je sais récupérer un fichier depuis un serveur distant.
  • Je sais copier un dossier complet avec -r.
  • Je sais utiliser un port SSH personnalisé (-P).
  • Je sais préserver permissions et dates avec -p.
  • Je sais transférer entre deux serveurs via -3.
  • Je connais la différence entre -p et -P.
  • Je sais quand utiliser rsync à la place de scp.
  • Je sais diagnostiquer un problème de connexion avec -v.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
5 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • -r : obligatoire pour copier un dossier
  • -P (majuscule) pour le port, -p (minuscule) pour les permissions
  • -v : indispensable pour diagnostiquer les problèmes SSH
  • Pas de reprise : si le transfert s'interrompt, il recommence
  • Préférer rsync pour les transferts réguliers ou volumineux

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn