Précédent | Sommaire | Index | Suivant


Chapitre 5 : utilisation de PSCP pour transférer des fichiers de façon sûre

PSCP, le client SCP ( Secure Copy ) associé à PuTTY, est un outil qui sert à transférer des fichiers de façon sûre d'une machine à une autre, via une connexion SSH.

Si vous avez accès à un serveur SSH-2, il se peut que vous préfériez PSFTP ( cf. chapitre 6 ) pour l'usage interactif. Mais il faut noter que PSFTP ne fonctionne généralement pas avec les serveurs SSH-1.


5.1. Démarrage de PSCP

PSCP est une application en ligne de commande. Vous ne pouvez donc pas vous contenter de double-cliquer sur son icône pour le lancer : il faut ouvrir une invite de commandes, et le lancer à partir de là. Sous Windows 95, 98, et Millenium, cela s'appelle « Commandes MS-DOS ». Sous Windows NT, 2000, et XP, c'est « Invite de commandes ». Vous trouverez cela dans la partie Programmes, ou Tous les programmes de votre menu Démarrer.

Pour lancer PSCP sans avoir besoin de préciser le chemin complet à chaque fois, il faut que le répertoire où se trouve PSCP figure dans votre PATH, ou alors que vous soyez dans ce répertoire-là au moment où vous tapez la commande. Pour ajouter le répertoire d'installation de PSCP à votre variable d'environnement PATH, tapez ceci dans la fenêtre « Invite de commandes » :

set PATH=C:\nom\du\répertoire\où\sont\installés\PuTTY\et\PSCP;%PATH%

Cela fonctionnera jusqu'à ce que vous refermiez cette fenêtre « Invite de commandes ». Pour que cela reste d'une fois sur l'autre, sous Windows NT, 2000 et XP, allez dans l'icône Système du Panneau de configuration de Windows, sélectionnez l'onglet Avancé et cliquez sur le bouton Variables d'environnement(1). Sous Windows 95, 98, et ME, il vous faudra modifier votre fichier AUTOEXEC.BAT pour y ajouter une commande set comme celle ci-dessus.


5.2. Utilisation de PSCP

Une fois que vous avez lancé une invite de commandes, vous pouvez taper simplement pscp pour obtenir les traditionnelles explications de base. Cela vous indique la version de PSCP que vous utilisez, et comment utiliser le programme :

C:\>pscp
PuTTY Secure Copy client
Release 0.60
Usage: pscp [options] [user@]host:source target
       pscp [options] source [source...] [user@]host:target
       pscp [options] -ls [user@]host:filespec
       Options:
       -V        print version information and exit
       -pgpfp    print PGP key fingerprints and exit
       -p        preserve file attributes
       -q        quiet, don't show statistics
       -r        copy directories recursively
       -v        show verbose messages
  -load sessname  Load settings from saved session
  -P port   connect to specified port
  -l user   connect with specified username
  -pw passw login with specified password
  -1 -2     force use of particular SSH protocol version
  -4 -6     force use of IPv4 or IPv6
  -C        enable compression
  -i key    private key file for authentication
  -noagent  disable use of Pageant
  -agent    enable use of Pageant
  -batch    disable all interactive prompts
  -unsafe   allow server-side wildcards (DANGEROUS)
  -sftp     force use of SFTP protocol
  -scp      force use of SCP protocol

L'interface de PSCP ressemble beaucoup à la commande Unix scp ( c'est bon à savoir si celle-ci vous est familière ).


5.2.1. Les bases

Pour télécharger un ( ou plusieurs ) fichier(s) depuis une machine distante :

pscp [options] [nom_utilisateur@]machine_distante:répertoire/source/sur/la/machine/distante répertoire\cible\sur\la\machine\locale

Donc pour copier le fichier /etc/hosts de la machine exemple.com, où on est connu sous le nom de fred, vers le fichier local c:\temp\exemple-hosts.txt, il faut taper :

pscp fred@exemple.com:/etc/hosts c:\temp\exemple-hosts.txt

Pour télécharger un ( ou plusieurs ) fichier(s) vers une machine distante :

pscp [options] source [source...] [user@]host:target

Donc pour copier le fichier local c:\documents\titi.txt vers la machine exemple.com, où l'on a un compte utilisateur fred, et l'y enregistrer dans le répertoire /tmp, sous le nom toto, il faut taper :

pscp c:\documents\titi.txt fred@exemple.com:/tmp/toto

Vous pouvez utiliser des caractères génériques pour transférer plusieurs fichiers à la fois, dans un sens ou dans l'autre :

pscp c:\documents\*.doc fred@exemple.com:docfiles
pscp fred@exemple.com:source/*.c c:\source

Cependant, dans le second cas ( si vous utilisez des caractères génériques pour désigner plusieurs fichiers situés sur la machine distante ), il se peut que vous receviez un message d'avertissement dans ce genre : 'warning: remote host tried to write to a file called 'terminal.c' when we requested a file called '*.c'. If this is a wildcard, consider upgrading to SSH-2 or using the '-unsafe' option. Renaming of this file has been disallowed'.

C'est dû à un problème de sécurité fondamental dans l'ancienne version du protocole SCP : le client envoie au serveur une chaîne contenant des caractères génériques ( '*.c', par exemple ), et le serveur renvoie au client une liste de noms de fichiers correspondant au motif de la requête. Mais rien n'empêche le serveur de renvoyer au client une liste de noms de fichiers qui ne correspond pas au motif demandé, et d'écraser l'un des fichiers du client. Si vous demandez, disons, tous les fichiers correspondant au motif '*.c', le serveur peut bien vous renvoyer le fichier AUTOEXEC.BAT et en profiter pour installer un virus sur la machine cliente. Étant donné que c'est le serveur qui décide si tel ou tel nom de fichier correspond au motif demandé par le client, le client ne peut pas vérifier de façon fiable que les noms de fichiers renvoyés par le serveur correspondent au motif.

PSCP s'efforce d'utiliser le protocole SFTP ( qui est plus récent, et qui fait partie de SSH-2 ) à chaque fois que c'est possible, parce que SFTP n'est pas affecté par cette faille de sécurité. Si vous vous adressez à un serveur SSH-2 qui gère le SFTP, vous ne verrez jamais cet avertissement ( vous pouvez imposer l'utilisation du protocole SFTP, s'il est disponible, avec l'option -sftp : cf. section 5.2.2.6 ).

Si vous avez vraiment besoin d'envoyer une chaîne avec des caractères génériques à un serveur SSH-1, vous pouvez utiliser l'option de ligne de commande -unsafe lors de l'appel de PSCP :

pscp -unsafe fred@exemple.com:source/*.c c:\source

Cela supprime le message d'avertissement, et le transfert de fichiers se fera. Toutefois, il faut être conscient du fait qu'en utilisant cette option -unsafe, vous donnez au serveur la possibilité d'écrire dans n'importe quel fichier du répertoire de destination. Il ne faut donc utiliser cette option que si vous avez toute confiance en l'administrateur de la machine distante, et que si vous pensez qu'elle n'a pas été « visitée » par des pirates. Vous pouvez aussi faire ce genre de téléchargement dans un répertoire initialement vide, ce qui limite bien sûr le risque d'écrasement de fichiers existants. Notez que même en mode 'unsafe', PSCP empêche le serveur d'écrire ailleurs que dans le répertoire cible ( cela protège contre les noms de fichiers qui comporteraient des '..' dans le chemin d'accès, pour remonter au répertoire parent ).


5.2.1.1. nom_utilisateur

Le nom d'utilisateur à utiliser pour se connecter à la machine distante. S'il n'est pas prcisé, et si machine_distante est une session PuTTY sauvegardée au lieu d'un nom de machine, PSCP prend le nom d'utilisateur indiqué dans cette session sauvegardée. Sinon, PSCP essaye d'utiliser le nom d'utilisateur qui a servi à ouvrir la session Windows.


5.2.1.2. machine_distante

Le nom de la machine distante, ou le nom d'une session PuTTY sauvegardée. Dans ce dernier cas, ce sont les nom d'hôte, numéro de port, type de chiffrement et nom d'utilisateur stockés dans cette session sauvegardée qui seront utilisés pour établir la connexion.


5.2.1.3. source ( les fichiers à transférer )

Un ou plusieurs fichiers à transférer(2). Les caractères génériques sont autorisés. Leur syntaxe dépend du système d'exploitation auquel ils s'appliquent : si vous copiez des fichiers depuis une machine Windows vers un système UNIX, il faut utiliser les caractères génériques façon Windows ( par exemple *.* ), alors que si vous copiez depuis UNIX vers Windows, il faut utiliser la syntaxe correspondant à votre votre shell UNIX ( par exemple * ).

Si la source du transfert est la machine distante, et si vous n'indiquez pas un chemin d'accès complet ( sous UNIX, un chemin commençant par un « slash » ), le répertoire que vous indiquez comme source du transfert sera interprété comme un chemin d'accès relatif partant de votre répertoire personnel ( home directory ) sur la machine distante.


5.2.1.4 target ( l'emplacement cible, destination du transfert )

Le nom du fichier cible, ou le répertoire dans lequel il faut placer le ou les fichier(s). Quand on copie depuis une machine distante vers la machine locale, on veut souvent placer les fichiers copiés dans le répertoire courant, tout simplement. Pour faire cela, il suffit d'indiquer '.' ( juste un point ) comme répertoire cible. Par exemple, la commande :

pscp fred@exemple.com:/home/tom/.emacs .

...aurait pour effet de copier le fichier .emacs, qui se trouve dans le répertoire /home/tom/ sur la machine distante, dans le répertoire courant.

Comme dans le cas du paramètre source, si l'emplacement cible se trouve sur la machine distante, et que ce n'est pas un chemin complet, partant de la racine, il sera interprété comme étant un chemin relatif à partir de votre répertoire personnel sur la machine distante.


5.2.2. Options

PSCP accepte toutes les options en ligne de commande de PuTTY et des outils associés, exception faite, bien entendu, de celles qui n'ont pas de sens dans un utilitaire de transfert de fichiers ( veuillez vous reporter à la section 3.8.3 pour en savoir plus sur ces options ) ( celles que PSCP ne reconnît pas y sont clairement indiquées ).

PSCP possède aussi certaines options qui lui sont propres. En voici la description :


5.2.2.1. -ls faire la liste des fichiers distants ( list remote files )

Si l'option -ls figure sur la ligne de commande, aucun fichier n'est transféré, et la liste des fichiers présents sur la machine distante est affichée. Seuls le nom d'hôte de la machine distante et une éventuelle indication de nom de fichiers sont attendues. Exemple :

pscp -ls fred@exemple.com:dir1
pscp -ls fred@exemple.com:dir1/*.c

Le protocole SCP en lui-même ne contient pas de commande qui permette de répérer la liste des fichiers de la machine distante. Si c'est le protocole SCP qui est utilisé, cette option sous-entend que le serveur répond correctement à la commande ls -la. Il se peut que cela ne fonctionne pas avec tous les serveurs. Si c'est le protocole SFTP qui est utilisé, cette option doit normalement fonctionner avec tous les serveurs.


5.2.2.2. -p conserver les attributs de fichiers ( preserve file attributes )

Par défaut, les fichiers copiés avec PSCP sont horodatés avec la date et l'heure auxquelles la copie a été faite. L'option -p permet de donner aux copies la date et l'heure des fichiers d'origine.


5.2.2.3. -qquiet ) : ne pas afficher les statistiques

Par défaut, PSCP affiche une ligne indiquant l'état du transfert en cours :

mibs.tar          |   168 kB |  84.0 kB/s | ETA: 00:00:13 |  13%

Les champs affichés sont ( de gauche à droite ) le nom de fichier, la taille de ce qui a déjà été transféré ( en kilo-octets ), une estimation de la vitesse de transfert ( en kilo-octets par seconde ), une estimation du délai restant avant la fin du transfert(3), et le pourcentage déjà transféré. L'option -q demande à PSCP de ne pas afficher ces statistiques.


5.2.2.4. -r : copier les répertoires de façon récursive

Par défaut, PSCP ne copie que les fichiers. Si vous indiquez des répertoires parmi les choses à copier, ils seront ignorés, de même que leur contenu. L'option -r demande à PSCP d'aller dans les répertoires que vous indiquez, et de les copier ainsi que leur contenu. Ceci vous permet d'utiliser PSCP pour transférer des arborescences complètes d'une machine à une autre.


5.2.2.5. -batch : fonctionnement sans interaction avec l'utilisateur

Si vous utilisez l'option -batch, PSCP n'affichera aucune invite interactive pendant l'établissement de la connexion. Si la clé d'hôte de la machine distante est invalide, par exemple ( voir à ce sujet la section 2.2 ), la connexion sera tout simplement abandonnée, au lieu que PSCP vous demande ce qu'il y a lieu de faire.

Cela peut faciliter l'utilisation de PSCP dans des scripts : avec l'option -batch, si quelque chose se passe mal lors de l'établissement de la connexion, le script se terminera, avec une erreur, plutôt que de rester bêtement coincé.


5.2.2.6. -sftp, -scp : forcer l'utilisation d'un protocole en particulier

Comme nous l'avons vu ci-dessus, dans la section 5.2.1, il y a deux protocoles de transfert de fichiers en usage dans SSH. En dépit de ce que son nom pourrait laisser croire, PSCP peut utiliser indifféremment ces deux protocoles ( tout comme la plupart des autres clients scp notables ).

L'ancien protocole SCP n'a pas fait l'objet d'une spécification écrite et il laisse un grand nombre de choses à la charge du serveur. Les caractères génériques, par exemple, sont résolus par le serveur. On peut ainsi utiliser n'importe quelle chaîne comportant des caractères génériques, du moment qu'ils sont reconnus par le serveur. Cela peut causer des problèmes d'interopérabilité, comme la nécessité de mettre des guillemets autour des noms de fichiers lorsque ceux-ci comportent des espaces. Cela peut également poser des problèmes de sécurité ( voir à ce sujet la section 5.2.1 ).

Le protocole SFTP, plus récent, et qui va généralement de pair avec les serveurs SSH-2, a fait l'objet d'une spécification plus précise et il est moins dépendant de la plate-forme serveur. La résolution des caractères génériques, par exemple, est du ressort du client ( les caractères génériques reconnus par le protocole SFTP, tel qu'il est implémenté, dans PuTTY et les outils associés, sont décrits dans la section 6.2.2 ). Cela le rend plus cohérent d'une plate-forme à l'autre, plus adapté à l'usage dans des scripts et à l'automatisation, et cela évite les problèmes de sécurité liés à la résolution des caractères génériques.

PSCP utilise le protocole SFTP en priorité, et ne se rabat sur le protocole SCP que si SFTP n'est pas géré par la machine distante.

L'option -scp force PSCP à utiliser le protocole SCP, s'il est reconnu par la machine distante, et à laisser tomber dans le cas contraire.

L'option -sftp force PSCP à utiliser le protocole SFTP, s'il est reconnu par la machine distante, et à laisser tomber s'il ne l'est pas. Lorsque cette option est utilisée, PSCP recherche activement un serveur SFTP, ce qui peut donner lieu à l'utilisation de SFTP avec un serveur SSH-1, selon la configuration de la machine distante.


5.2.3. Valeur de retour

PSCP renvoie un ERRORLEVEL nul ( synonyme de succès ) uniquement si les fichiers ont été correctement transférés. Vous pouvez le vérifier, dans un script batch, en faisant comme ceci :

pscp fichiers*.* nom_utilisateur@machine_distante:
if errorlevel 1 echo Attention, il y a eu une erreur !


5.2.4. Utilisation de l'authentification à clé publique avec PSCP

Tout comme PuTTY, PSCP sait gérer l'authentification par clé publique plutôt que par mot de passe. Il y a trois façons de faire cela.

  1. Premièrement, PSCP peut utiliser des sessions PuTTY sauvegardées en lieu et place de noms d'hôtes ( cf. section 5.2.1.2 ) :
  2. Deuxièmement, vous pouvez indiquer le nom d'un fichier de clé privée en ligne de commande, grâce à l'option -i ( pour plus d'informations à ce sujet, veuillez vous reporter à la section 3.8.3.18 ).
  3. Enfin, troisièmement, quand Pageant est lancé, PSCP essaie de s'authentifier en passant par Pageant ( pour plus d'informations à ce sujet, veuillez vous reporter au chapitre 9 ). Voici comment procéder :

Pour plus d'informations au sujet de l'authentification par clé publique / clé privée, veuillez vous reporter au chapitre 8.

 

NdT n°1 : l'intitulé exact des onglets et des boutons varie d'une version de Windows à l'autre.

NdT n°2 : dans la version anglaise de cette documentation, le terme d'origine était "One or more source files." Je me suis abstenu de traduire cela par "un ou plusieurs fichier source", afin d'éviter la confusion avec les fichiers source d'un programme, avant compilation.

NdT n°3 : ETA = Estimated Time of Arrival ( heure prévue d'arrivée ) : abréviation d'usage courant dans les transports publics.


Si vous souhaitez faire part aux auteurs de PuTTY de votre avis sur ce manuel, ou sur les outils PuTTY eux-mêmes, veuillez vous reporter à la page "Feedback" ( merci de leur écrire exclusivement en anglais ). Si vos remarques portent sur la traduction, merci de vous adresser directement au  traducteur, et non à l'équipe de développement.

[PuTTY release 0.60]

Valid HTML 4.01 Strict