SCP est l’outil classique pour copier de manière chiffrée des fichiers entre postes distants sous Linux et les systèmes d’ex­ploi­ta­tion com­pa­tibles POSIX. L’abré­via­tion SCP signifie « secure copy », et le terme « secure » fait référence au chif­fre­ment employé pour le transfert sécurisé des données. Le nom du protocole SCP est dérivé de deux tech­no­lo­gies 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 chif­fre­ment, en réseau.

La commande SCP est un logiciel exécuté sur le système local et le serveur. L’uti­li­taire agit comme daemon et comme client pour le protocole SCP. Dans la mesure où SCP fait partie de la dis­tri­bu­tion OpenSSH très répandue, il est dis­po­nible sur pra­ti­que­ment 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 in­con­vé­nient du protocole SCP est que le logiciel a connu une crois­sance organique. Il s’ensuit qu’il n’existe pas de nor­ma­li­sa­tion, ni de document RFC des­crip­tif ou de spé­ci­fi­ca­tion com­pa­rable. On trouve seulement à la place une im­plé­men­ta­tion de référence qui fait partie du projet OpenSSH. Aujourd’hui, il existe des solutions al­ter­na­tives modernes à SCP, qui lui sont pré­fé­rables dans la plupart des cas.

Fonc­tion­ne­ment et uti­li­sa­tion de la commande SCP de Linux

Le fonc­tion­ne­ment 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 com­mu­ni­ca­tion réseau passe par le port TCP 22. Voici un aperçu des commandes Linux courantes pour copier des fichiers :

Commande de copie Nom Fonc­tion­na­lité Accès à distance
cp Copy Copie, local uni­que­ment -
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 ; ma­ni­pu­la­tion de systèmes de fichiers distants SSH
rsync Remote sync Copie sécurisée local, local-distant, distant-distant ; syn­chro­ni­sa­tion SSH, Stunnel

Avec SCP, on peut copier un fichier sur un serveur ou té­lé­char­ger un fichier depuis un serveur. Le protocole n’autorise qu’un flux de données uni­di­rec­tion­nel, 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é­ces­saire, les attributs du fichier source peuvent être trans­fé­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 par­ti­cu­la­ri­tés. SCP recourt au protocole SSH pour établir les con­nexions chiffrées. L’accès à un système distant par SSH a lieu soit avec un nom d’uti­li­sa­teur 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 trans­fé­rer un fichier d’un système (hôte) distant à un autre hôte, la séquence suivante se produit :

  1. L’uti­li­sa­teur demande à l’outil SCP de son système local de trans­fé­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’uti­li­sa­teur 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 fonc­tionne, une clé SSH publique doit être en­re­gis­tré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 in­ter­ven­tion de l’uti­li­sa­teur, ce qui comporte un risque de sécurité. Il existe donc une solution al­ter­na­tive plus moderne :

  1. L’uti­li­sa­teur demande à l’outil SCP de son système local de trans­fé­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’uti­li­sa­teur doivent être en­re­gis­trées sur l’hôte 1 et l’hôte 2. C’est déjà le cas dans de nombreux scénarios d’ap­pli­ca­tion, par exemple quand l’uti­li­sa­teur est un ad­mi­nis­tra­teur 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 cor­rec­te­ment. 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 des­ti­na­tion). 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 des­ti­na­tion, 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’uti­li­sa­teur qui veut accéder à l’hôte :

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

Nous re­pré­sen­tons l’in­di­ca­tion '<Uti­li­sa­teur>@<Hôte>' sous la forme 'uti­li­sa­teur@exemple.com' (pour l’hôte 1) et 'uti­li­sa­teur@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 fonc­tion­ne­ment de la commande SCP est contrôlé par diverses options. Voici une sélection des options les plus utiles :

Option Sig­ni­fi­ca­tion Com­men­taire
-C Com­pres­sion du fichier À ne pas confondre avec l’option '-c' (cipher), qui gère le chif­fre­ment
-p Transfert des attributs du fichier source vers le fichier cible (per­mis­sions) À ne pas confondre avec l’option '-P', qui définit le port réseau
-r Copie récursive des ré­per­toires -
-v Affichage détaillé de la sortie (verbose) -
-q Sup­pres­sion de la sortie (quiet) -
-3 Envoi de données par le système local (third party) -
Conseil

Pour une des­crip­tion détaillée de l’ensemble des options dis­po­nibles, consultez la man page de la commande SCP.

Exemples d’uti­li­sa­tion de la commande SCP de Linux

La commande SCP peut être employée de multiples façons et combinée aux ex­pres­sions connues pour indiquer des fichiers et des ré­per­toires. Compte tenu du large éventail des scénarios d’ap­pli­ca­tion en­vi­sa­geables, nous ne pré­sen­tons ici que quelques cas de figure ca­rac­té­ris­tiques. 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é­per­toire 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 uti­li­sa­teur nommé 'uti­li­sa­teur'.

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é­per­toire '/chemin/vers/ré­per­toi­re' 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é­per­toire actuel comme des­ti­na­tion :

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

Nous pré­sen­tons ici une variante du premier exemple dans laquelle nous copions le fichier dans le dossier « Bureau » du dossier uti­li­sa­teur, symbolisé par le tilde « ~ ». L’uti­li­sa­tion du tilde permet de subs­ti­tuer le dossier de l’uti­li­sa­teur local. Pour éviter toute erreur, il est conseillé de placer un chemin avec tilde entre guil­le­mets :

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

Pour copier le fichier et l’en­re­gis­trer sous un autre nom, il faut indiquer le nouveau nom à la fin du chemin de des­ti­na­tion :

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é­per­toire actuel, il n’est donc pas né­ces­saire 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é­ta­ca­rac­tères tels que '?' et '*'. Bien que ceux-ci per­met­tent de rac­cour­cir l’écriture des noms de fichiers, ils peuvent engendrer des erreurs inat­ten­dues 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é­per­toire entier

Comme avec la commande CP, un ré­per­toire 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é­per­toires du ré­per­toire 'ré­per­toi­re' se re­trou­ve­ront en copie sur l’hôte sous le chemin '/chemin/vers/ré­per­toi­re'.

Pour trans­fé­rer des fichiers vo­lu­mi­neux, il est judicieux d’utiliser l’option '-C' afin de com­pres­ser les fichiers à trans­fé­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 in­té­gra­lité. Si le transfert est in­ter­rompu, il faut tout re­com­men­cer. Pour copier de gros ré­per­toires ou si la connexion réseau est chan­ce­lante, 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 des­ti­na­tion doivent contenir les in­for­ma­tions relatives à l’uti­li­sa­teur 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’uti­li­sa­tion 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 sau­ve­garde à distance de fichiers qui ne sont plus né­ces­saires lo­ca­le­ment. Comme le laisse supposer la dis­tinc­tion 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 fa­ci­le­ment y parvenir à l’aide des méthodes courantes.

Examinons d’abord l’opération de dé­pla­ce­ment, qui consiste à copier puis à supprimer le fichier. Cette séquence est réalisée dans l’interface en ligne de commande par la com­bi­nai­son des commandes 'scp' et 'rm', cette dernière servant à supprimer un fichier. Nous en­chaî­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é­per­toire actuel. Fa­cul­ta­ti­ve­ment, nous ajoutons une ex­pres­sion pour inclure seulement certains fichiers ou types de fichiers. Comme nous voulons réaliser une sau­ve­garde exacte de chaque fichier, nous utilisons l’option '-p' pour copier également les attributs des fichiers. Sachant que la création d’une sau­ve­garde est un processus critique, nous ajoutons l’option '-v' pour demander à la commande SCP de fournir des in­for­ma­tions sup­plé­men­taires 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 al­ter­na­tives à la commande SCP de Linux

Même si SCP est dis­po­nible sur pra­ti­que­ment tous les systèmes, ce n’est plus la meilleure méthode pour copier des fichiers en réseau. Les dé­ve­lop­peurs du projet OpenSSH, qui héberge SCP, le re­con­nais­sent eux-mêmes.

Les solutions al­ter­na­tives désignées par les in­for­ma­ti­ciens qui assurent la main­te­nance de SCP, en l’oc­cur­rence SFTP (Secure File Transfer Protocol) et Rsync (Remote Sync), recourent également à SSH pour l’accès chiffré à l’hôte distant. Ces deux pro­grammes offrent davantage de fonctions et con­ti­nuent d’être dé­ve­lop­pés. Le seul in­con­vé­nient de ces outils est qu’ils doivent parfois être installés au préalable, alors que SCP est préins­tallé sur quasiment tous les systèmes. Examinons d’un peu plus près ces deux solutions al­ter­na­tives.

SFTP est plus ou moins le suc­ces­seur direct de SCP. Le transfert de données est chiffré et s’appuie sur l’in­fras­truc­ture SSH existante. Con­crè­te­ment, 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 trans­fé­rées sont au­to­ma­ti­que­ment con­trô­lées pour vérifier qu’elles sont exactes, et les trans­ferts in­ter­rom­pus peuvent être repris.

Rsync est un autre uti­li­taire puissant qui peut prendre en charge toutes les tâches de SCP. Cependant, Rsync n’est pas à pro­pre­ment parler une commande de copie. Cet outil peut faire beaucoup plus et est spé­cia­le­ment conçu pour le transfert efficace de fichiers vo­lu­mi­neux 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 dif­fé­rence. Lorsqu’un transfert est in­ter­rompu, il peut être redémarré sans qu’il ne soit né­ces­saire de re­com­men­cer 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.

Aller au menu principal