Passer au contenu principal

Transférer des fichiers sous Linux avec SCP

. Présentation

Dans ce tutoriel sous Linux, nous allons voir comment utiliser SCP pour transférer des fichiers entre deux hôtes de façon sécurisée.

SCP veut dire Secure Copy et il est utilisé pour copier en toute sécurité des fichiers de votre ordinateur local vers des serveurs distants, et inversement, à l'aide du protocole SSH (d'où le fait que ce soit sécurisé). Si SCP est utilisé pour copier des fichiers, la communication entre le serveur distant et votre ordinateur sera chiffrée, de la même manière que les connexions à distance SSH que l'on utilise pour administrer un serveur. Ainsi, il fournit la même méthode d'authentification et le même niveau de sécurité que SSH : c'est l'avantage d'utiliser SCP.

Avant de commencer, voici quelques rappels :

  • La scp commande s'appuie sur ssh pour le transfert de données, elle nécessite donc une clé ssh ou un mot de passe pour s'authentifier sur les systèmes distants.
  • Les deux points ( : ) permettent de faire la distinction entre les emplacements locaux et distants.
  • Pour pouvoir copier des fichiers, vous devez au moins disposer d'autorisations de lecture et écriture (rw - 600) sur le système cible.
  • Soyez prudent lorsque vous copiez des fichiers qui ont le même nom et le même emplacement sur les deux systèmes, avec scp cela écrasera les fichiers sans avertissement.
  • Lors du transfert de fichiers volumineux, il est recommandé d'exécuter la commande scp dans une session screen.

II. Installation de SSH sur les deux machines

Pour utiliser SCP, SSH doit être installé sur les deux instances. Vous pouvez facilement installer le service OpenSSH qui contient toutes les dépendances liées à SSH, SCP, SFTP, etc.

Exécutez cette commande :

apt install ssh # Oui c'est bien ssh, ssh est un alias pour le paquet OpenSSH

En guise d'exemple, je vais utiliser deux machines sous Linux.

  • Kali Linux 2021.x avec le paquet SSH installé
  • Ubuntu 20.04 LTS avec le paquet SSH installé

scp fournit un certain nombre d'options qui contrôlent chaque aspect de son comportement. Les options les plus utilisées sont :

  • -P : spécifie le port ssh de l'hôte distant.
  • -q : utilisez cette option si vous souhaitez supprimer la jauge de progression et les messages de non-erreur.
  • -C : cette option force scp à compresser les données lorsqu'elles sont envoyées à la machine de destination.
  • -r : cette option indique scp de copier les répertoires de manière récursive.
  • -v : active le mode verbeux (verbose), cela vous permettra de voir les logs en temps réel sur votre terminal lors de la copie. Pratique en cas de troubleshooting (visualisation des droits, etc.)

III. Exemples d'utilisation de SCP

A. SCP : copier un fichier local vers un serveur distant (dossier courant)

Commençons par utiliser SCP pour copier un fichier situé en local sur notre ordinateur vers un serveur distant dans le dossier "courant de l'utilisateur" : /home/user/

Dans cet exemple, j'ai un fichier backup.zip dans le dossier /home/kali/test. Je souhaite le copier sur mon serveur distant dans le dossier /home/user de mon utilisateur "user" afin de pouvoir l'exploiter. Pour ce fait, je vais utiliser la commande suivante :

scp <fichier à envoyer> <utilisateur>@<hôte distant>:<dossier cible>
scp backup.zip user@192.168.130.134:/home/user/

# ou plus court, mais plus abstrait pour préciser le répertoire de l'utilisateur : 

scp backup.zip user@192.168.130.134:~

# ou avec port SSh distant
scp -P2222 backup.zip user@192.168.130.134:/home/user/
Copier un fichier local sur un serveur distant avec SCP
Copier un fichier local sur un serveur distant avec SCP

Le fichier "backup.zip" est bien disponible sur mon hôte distant suite à cette copie.

Ici, je n'utilise pas l'authentification par clé privée / publique car je ne suis pas en condition réelle. Dans le cas d'utilisation de SCP en production, notamment dans un script, vous devrez obligatoirement passer par l'authentification par clé pour des raisons de sécurité (exemple dans la section suivante).

B. SCP : copier un fichier via l'authentification par clés

Si vous ne possédez pas de clés SSH (publique/privé), je vous invite à exécuter la série de commandes ci-dessous afin de :

  • Générer un couple de clés privée/publique
  • Copier votre clé publique vers votre serveur distant
  • Établir une connexion sans mot de passe via ssh/scp/sftp à votre serveur
Mise en place de l'authentification par clé SSH
Mise en place de l'authentification par clé SSH

Ensuite, le mot de passe ne sera plus demandé lors de la phase d'authentification puisque la clé sera fournie automatiquement. Pour la suite des exemples, je vous propose les commandes SCP les plus utiles selon moi en fonction de chaque cas d'utilisation.

C. Copier un dossier local et son contenu vers un serveur distant

Dans ce scénario, je vais copier mon dossier "folder/" et tout son contenu (mode récursif via l'option -r) vers mon serveur distant. Il faut bien préciser le "/" après "folder". Voici la commande :

scp -r folder/ user@192.168.130.134:/home/user/

D. Copier un dossier distant vers mon hôte local

Faisons l'opération inverse afin de copier un répertoire du serveur distant vers notre hôte local. Autrement dit, nous allons rapatrier des données du serveur vers notre PC. Précisez bien le chemin absolu de vos deux sources, cela vous évitera de faire des erreurs. Voici un exemple pour télécharger les données vers mon dossier local "/home/kali" :

scp -r user@192.168.130.134:/var/log/ /home/kali/

E. Copier un fichier distant vers mon hôte local

Dans le même esprit que l'exemple précédent, cette fois-ci on va simplement copier un fichier, et non pas un dossier complet. Ici, je vais copier le fichier file.txt du répertoire distant "/home/user/" vers mon répertoire "/tmp" local.

scp user@192.168.130.134:/home/user/file.txt /tmp

F. Copier plusieurs fichiers distants vers mon hôte local

Si vous souhaitez copier plusieurs fichiers distants situés dans le même répertoire courant, utilisez cette commande. Si vos fichiers ne sont pas tous dans le même dossier source, je vous invite à préciser les chemins absolus de chaque fichier. Voici un exemple pour copier les trois fichiers "install.txt", "file1.txt" et "file2.txt".

scp install.txt file1.txt file2.txt \ 
user@192.168.130.134:/tmp

G. Copier un fichier entre deux systèmes distants à l'aide d'un hôte local

Dans ce cas un peu particulier, nous allons copier un fichier de mon hôte distant 1 vers mon hôte distant 2 depuis ma machine locale (il y a donc 3 hôtes au total). Ce transfert de fichier sera sous la houlette de la machine hote1.com, de même que le flux d'authentification.

Autrement dit, ce fichier n'est pas présent sur mon système local (là ou j'exécute la commande). Je demande à host1.com de copier son fichier local file.txt vers le dossier /tmp de host2.com.

Ce qui donne la commande suivante :

scp user@host1.com:/files/file.txt user2@host2.com:/tmp/

Si vous souhaitez que la partie authentification soit gérée par votre machine locale (dans mon cas l'hôte Kali Linux), utilisez l'option -3. Le flux de données  (la copie) sera géré par host1, tandis que la partie authentification sera gérée par votre machine locale.

Note : cette option est utile seulement si vous avez l'authentification par clés mises en place sur host1 et host2.

scp -3 user1@host1.com:/files/file.txt user2@host2.com:/files

Remarque : contrairement à rsync , lors de l'utilisation de scp vous n'avez pas besoin de vous connecter à l'un des serveurs pour transférer des fichiers d'une machine distante à une autre. La commande suivante copiera le fichier /files/file.txt de l'hôte distant host1.com dans le répertoire /files de l'hôte distant host2.com.

Avec ces différents exemples, vous êtes en mesure de transférer des fichiers via SCP sous Linux ! Si vous utilisez Windows, il est possible d'utiliser les commandes scp également, mais aussi WinSCP avec une interface graphique, ou encore le module WinSCP en PowerShell.