Commande SCP de Linux

SCP est l’outil classique pour copier de manière chiffrée des fichiers entre postes distants sous Linux et les systèmes d’exploitation compatibles POSIX. L’abréviation SCP signifie « secure copy », et le terme « secure » fait référence au chiffrement employé pour le transfert sécurisé des données. Le nom du protocole SCP est dérivé de deux technologies sous-jacentes :

  • le protocole SSH (secure shell), qui permet l’accès chiffré aux systèmes distants ;
  • l’outil RCP (remote copy), qui copie les fichiers de manière non sécurisée, c’est-à-dire sans chiffrement, en réseau.

La commande SCP est un logiciel exécuté sur le système local et le serveur. L’utilitaire agit comme daemon et comme client pour le protocole SCP. Dans la mesure où SCP fait partie de la distribution OpenSSH très répandue, il est disponible sur pratiquement tous les systèmes. La commande SCP est exécutée dans l’interface en ligne de commande, comme il est d’usage avec Linux.

Un fâcheux inconvénient du protocole SCP est que le logiciel a connu une croissance organique. Il s’ensuit qu’il n’existe pas de normalisation, ni de document RFC descriptif ou de spécification comparable. On trouve seulement à la place une implémentation de référence qui fait partie du projet OpenSSH. Aujourd’hui, il existe des solutions alternatives modernes à SCP, qui lui sont préférables dans la plupart des cas.

Fonctionnement et utilisation de la commande SCP de Linux

Le fonctionnement de la commande SCP est analogue à celui de l’ancienne commande RCP. Comme pour RCP, la syntaxe de SCP dans l’interface en ligne de commande suit la commande CP servant à copier des fichiers sur le système local. Comme SCP s’appuie sur le protocole SSH, la communication réseau passe par le port TCP 22. Voici un aperçu des commandes Linux courantes pour copier des fichiers :

Commande de copie

Nom

Fonctionnalité

Accès à distance

cp

Copy

Copie, local uniquement

-

rcp

Remote copy

Copie local-distant, distant-distant

RSH

scp

Secure copy

Copie sécurisée local-distant, distant-distant

SSH

sftp

Secure file transfer protocol

Copie sécurisée local-distant, distant-distant ; manipulation de systèmes de fichiers distants

SSH

rsync

Remote sync

Copie sécurisée local, local-distant, distant-distant ; synchronisation

SSH, Stunnel

Avec SCP, on peut copier un fichier sur un serveur ou télécharger un fichier depuis un serveur. Le protocole n’autorise qu’un flux de données unidirectionnel, ce qui veut dire qu’on ne peut copier des fichiers que dans un seul sens à chaque connexion. En outre, avec SCP, il est possible de copier des fichiers entre deux systèmes en réseau. Si nécessaire, les attributs du fichier source peuvent être transférés au fichier cible pendant l’opération de copie.

Flux de données lors de la copie entre deux systèmes distants

Si vous voulez copier un fichier entre deux systèmes distants sous Linux avec SCP, vous devez garder à l’esprit certaines particularités. SCP recourt au protocole SSH pour établir les connexions chiffrées. L’accès à un système distant par SSH a lieu soit avec un nom d’utilisateur et un mot de passe, soit à l’aide de clés SSH (paire de clés publique/privée). En général, la méthode privée est préférable à la méthode publique.

Dans la version originale, où SCP est utilisé pour transférer un fichier d’un système (hôte) distant à un autre hôte, la séquence suivante se produit :

  1. L’utilisateur demande à l’outil SCP de son système local de transférer un fichier situé sur l’hôte 1 vers l’hôte 2.
  2. Le programme SCP sur le système local de l’utilisateur ouvre une connexion SSH avec l’hôte 1 et exécute le programme SCP qui s’y trouve.
  3. Le programme SCP de l’hôte 1 ouvre une connexion SSH avec l’hôte 2 et transfère le fichier stocké sur l’hôte 1 vers l’hôte 2 comme s’il s’agissait d’un fichier local.

Pour que ce processus fonctionne, une clé SSH publique doit être enregistrée de l’hôte 1 vers l’hôte 2. Si tel est le cas, cela signifie qu’il existe un accès permanent de l’hôte 1 à l’hôte 2 sans intervention de l’utilisateur, ce qui comporte un risque de sécurité. Il existe donc une solution alternative plus moderne :

  1. L’utilisateur demande à l’outil SCP de son système local de transférer un fichier situé sur l’hôte 1 vers l’hôte 2.
  2. SCP ouvre une connexion SSH avec l’hôte 1 et l’hôte 2.
  3. Le fichier est acheminé de l’hôte 1 au système local et transféré à l’hôte 2.

Ici, les clés SSH publiques de l’utilisateur doivent être enregistrées sur l’hôte 1 et l’hôte 2. C’est déjà le cas dans de nombreux scénarios d’application, par exemple quand l’utilisateur est un administrateur qui a accès aux deux hôtes.

Syntaxe de la commande SCP de Linux

La syntaxe d’une commande définit la manière dont celle-ci doit être saisie pour être exécutée correctement. La syntaxe de la commande SCP est détaillée ci-dessous. La commande SCP repose sur la syntaxe de la commande CP, laquelle sert à copier des fichiers sur le système local (un fichier situé sur un chemin d’origine est copié vers un chemin de destination). Certaines options peuvent être ajoutées devant le chemin d’origine selon les besoins :

scp <Options> <Chemin source> <Chemin destination>

Pour copier des fichiers depuis, vers ou entre des systèmes distants, le chemin d’accès d’origine ou de destination, ou les deux, sont remplacés par un chemin plus complexe. Ce chemin contient le nom de réseau ou l’adresse IP de l’hôte ainsi que le nom de l’utilisateur qui veut accéder à l’hôte :

<Utilisateur>@<Hôte>:<Répertoire/Fichier.Extension>

Nous représentons l’indication '<Utilisateur>@<Hôte>' sous la forme 'utilisateur@exemple.com' (pour l’hôte 1) et 'utilisateur@www.exemple.com' (pour l’hôte 2).

Options de la commande SCP de Linux

Comme d’habitude avec les outils de ligne de commande, le fonctionnement de la commande SCP est contrôlé par diverses options. Voici une sélection des options les plus utiles :

Option

Signification

Commentaire

-C

Compression du fichier

À ne pas confondre avec l’option '-c' (cipher), qui gère le chiffrement

-p

Transfert des attributs du fichier source vers le fichier cible (permissions)

À ne pas confondre avec l’option '-P', qui définit le port réseau

-r

Copie récursive des répertoires

-

-v

Affichage détaillé de la sortie (verbose)

-

-q

Suppression de la sortie (quiet)

-

-3

Envoi de données par le système local (third party)

-

Conseil

Pour une description détaillée de l’ensemble des options disponibles, consultez la man page de la commande SCP.

Exemples d’utilisation de la commande SCP de Linux

La commande SCP peut être employée de multiples façons et combinée aux expressions connues pour indiquer des fichiers et des répertoires. Compte tenu du large éventail des scénarios d’application envisageables, nous ne présentons ici que quelques cas de figure caractéristiques. Il convient de noter qu’aujourd’hui, d’autres outils sont préférables à la commande SCP pour copier des fichiers en réseau.

Copier un fichier du système local vers le système distant

Pour copier un fichier 'fichier.txt' du répertoire actuel sur le système local vers l’hôte 'exemple.com', il faut saisir la commande SCP suivante. Remarque : nous simulons ici un accès à l’hôte 'exemple.com' comme utilisateur nommé 'utilisateur'.

scp fichier.txt utilisateur@exemple.com:/chemin/vers/répertoire

Une fois l’opération terminée, le fichier 'fichier.txt' se trouve dans le répertoire '/chemin/vers/répertoire' de l’hôte.

Copier un fichier du système distant vers le système local

Pour inverser le sens de l’opération, il suffit de permuter les chemins local et distant. Dans le premier exemple, nous avons utilisé le point '.' pour indiquer le répertoire actuel comme destination :

scp utilisateur@exemple.com:/chemin/vers/répertoire/fichier.txt .

Nous présentons ici une variante du premier exemple dans laquelle nous copions le fichier dans le dossier « Bureau » du dossier utilisateur, symbolisé par le tilde « ~ ». L’utilisation du tilde permet de substituer le dossier de l’utilisateur local. Pour éviter toute erreur, il est conseillé de placer un chemin avec tilde entre guillemets :

scp utilisateur@exemple.com:/chemin/vers/répertoire/fichier.txt "~/Bureau/"

Pour copier le fichier et l’enregistrer sous un autre nom, il faut indiquer le nouveau nom à la fin du chemin de destination :

scp utilisateur@exemple.com:/chemin/vers/répertoire/fichier.txt "~/Bureau/fichier.bak"

Copier plusieurs fichiers

Si vous maîtrisez déjà la commande CP, vous vous doutez peut-être que l’on peut également copier plusieurs fichiers à l’aide de la commande SCP. La méthode la plus simple est de lister les fichiers un par un. Dans l’exemple suivant, les fichiers sont situés dans le répertoire actuel, il n’est donc pas nécessaire de spécifier le chemin d’accès de chaque fichier :

scp fichier-1.txt fichier-2.txt utilisateur@exemple.com:/chemin/vers/répertoire

Il convient d’être prudent avant d’employer des métacaractères tels que '?' et '*'. Bien que ceux-ci permettent de raccourcir l’écriture des noms de fichiers, ils peuvent engendrer des erreurs inattendues quand ils sont placés dans le chemin hôte. Dans ce cas, il vaut mieux utiliser une boucle, comme indiqué dans notre exemple « Déplacer des fichiers vers un système distant », ou recourir à un autre outil.

Copier un répertoire entier

Comme avec la commande CP, un répertoire entier peut être copié de manière récursive. Pour cela, il faut ajouter l’option '-r' devant le chemin d’origine.

scp -r répertoire utilisateur@exemple.com:/chemin/vers/répertoire

Après une exécution réussie, tous les fichiers et sous-répertoires du répertoire 'répertoire' se retrouveront en copie sur l’hôte sous le chemin '/chemin/vers/répertoire'.

Pour transférer des fichiers volumineux, il est judicieux d’utiliser l’option '-C' afin de compresser les fichiers à transférer :

scp -C -r répertoire utilisateur@exemple.com:/chemin/vers/répertoire
Note

Gardez à l’esprit que SCP transfère toujours l’ensemble des fichiers dans leur intégralité. Si le transfert est interrompu, il faut tout recommencer. Pour copier de gros répertoires ou si la connexion réseau est chancelante, il vaut mieux employer un autre outil.

Copier un fichier entre deux systèmes distants

Pour copier un fichier entre deux hôtes, on utilise la commande SCP sans indiquer de chemin local. Les chemins d’accès d’origine et de destination doivent contenir les informations relatives à l’utilisateur et à l’hôte :

scp utilisateur@exemple.com:/chemin/vers/répertoire/fichier.txt utilisateur@www.exemple.com:/chemin/vers/autre/répertoire

Comme indiqué au début, en général il vaut mieux faire passer le transfert par son propre système. Pour cela, il convient d’ajouter l’option '-3' devant le chemin d’origine :

scp -3 utilisateur@exemple.com:/chemin/vers/répertoire/fichier.txt utilisateur@www.exemple.com:/chemin/vers/autre/répertoire

Déplacer des fichiers vers un système distant

Un scénario plus complexe d’utilisation de la commande SCP consiste à déplacer des données locales vers un hôte. Le but peut être, par exemple, de créer une sauvegarde à distance de fichiers qui ne sont plus nécessaires localement. Comme le laisse supposer la distinction entre les commandes locales 'cp' (copier) et 'mv' (déplacer), SCP ne possède pas d’option dédiée pour déplacer un fichier. Toutefois, on peut facilement y parvenir à l’aide des méthodes courantes.

Examinons d’abord l’opération de déplacement, qui consiste à copier puis à supprimer le fichier. Cette séquence est réalisée dans l’interface en ligne de commande par la combinaison des commandes 'scp' et 'rm', cette dernière servant à supprimer un fichier. Nous enchaînons les commandes avec l’opérateur logique AND '&&' afin que la deuxième commande ne soit exécutée que si la première a réussi. Ainsi, nous serons sûrs que la copie aura bien été créée sur l’hôte avant que l’original local ne soit supprimé.

Enfin, nous utilisons une boucle 'for' pour traiter tous les fichiers situés dans le répertoire actuel. Facultativement, nous ajoutons une expression pour inclure seulement certains fichiers ou types de fichiers. Comme nous voulons réaliser une sauvegarde exacte de chaque fichier, nous utilisons l’option '-p' pour copier également les attributs des fichiers. Sachant que la création d’une sauvegarde est un processus critique, nous ajoutons l’option '-v' pour demander à la commande SCP de fournir des informations supplémentaires sur l’état de l’opération.

for fichier dans ./modèle*.extension ; do scp -p -v "$fichier" utilisateur@exemple.com:"/sauvegarde/${fichier}.bak" && rm "$fichier" ; fait

Solutions alternatives à la commande SCP de Linux

Même si SCP est disponible sur pratiquement tous les systèmes, ce n’est plus la meilleure méthode pour copier des fichiers en réseau. Les développeurs du projet OpenSSH, qui héberge SCP, le reconnaissent eux-mêmes.

Les solutions alternatives désignées par les informaticiens qui assurent la maintenance de SCP, en l’occurrence SFTP (Secure File Transfer Protocol) et Rsync (Remote Sync), recourent également à SSH pour l’accès chiffré à l’hôte distant. Ces deux programmes offrent davantage de fonctions et continuent d’être développés. Le seul inconvénient de ces outils est qu’ils doivent parfois être installés au préalable, alors que SCP est préinstallé sur quasiment tous les systèmes. Examinons d’un peu plus près ces deux solutions alternatives.

SFTP est plus ou moins le successeur direct de SCP. Le transfert de données est chiffré et s’appuie sur l’infrastructure SSH existante. Concrètement, cela signifie que SFTP peut être utilisé pour accéder aux systèmes de fichiers distants d’hôtes pour lesquels il existe un accès SSH depuis le système local. Le protocole SFTP offre un éventail de fonctions beaucoup plus large que SCP. Les données transférées sont automatiquement contrôlées pour vérifier qu’elles sont exactes, et les transferts interrompus peuvent être repris.

Rsync est un autre utilitaire puissant qui peut prendre en charge toutes les tâches de SCP. Cependant, Rsync n’est pas à proprement parler une commande de copie. Cet outil peut faire beaucoup plus et est spécialement conçu pour le transfert efficace de fichiers volumineux et de grandes quantités de données. Pour ce faire, Rsync compare les données présentes côté source et côté cible et ne transfère que la différence. Lorsqu’un transfert est interrompu, il peut être redémarré sans qu’il ne soit nécessaire de recommencer depuis le début.

En résumé

S’ils sont présents sur votre système, vous avez tout intérêt à utiliser les outils SFTP ou Rsync à la place de SCP pour copier des fichiers en réseau.