next up previous contents index
Next: Bibliothèque NET:FTP Up: Protocole FTP Previous: Protocole FTP   Contents   Index


Protocole FTP

Le protocole FTP (File Transfert Protocol) permet d'échanger des fichiers entre un serveur et un client. C'est un protocole relativement ancien mais toujours très utilisé car efficace et simple.

Dans un premier temps, nous proposons ce mois-ci d'examiner les principales commandes FTP en utilisant l'outil telnet. Puis nous programmerons un client FTP en Scheme. Pour cela, nous ferons appel à la bibliothèque NET d'OpenScheme.

Pour effectuer les exemples de cet article, il est nécessaire de disposer d'un serveur FTP. Votre système Linux dispose sûrement du serveur wu-ftpd, mais vous pouvez utiliser tout serveur FTP de l'Internet.

Le protocole FTP dépasse de beaucoup le simple transfert de fichier entre un serveur et un client. Il permet un accès interactif, de spécifier le format des données transférées et l'authentification lors de la connexion.

Le protocole FTP se distingue de la plupart des autres protocoles d'échange d'informations par le fait qu'au moins deux connexions sont utilisées, l'une pour la supervision du transfert et l'autre pour les données échangées. Plusieurs connexions peuvent être créées pour une seule connexion de supervision.

Nous allons explorer le protocole FTP en utilisant telnet. C'est presque le plus bas niveau d'interface possible qui montre bien les mécanismes mis en jeux. Le port standard pour la connexion FTP est le port 21. Nous pouvons ouvrir une session FTP avec telnet :

$ telnet localhost 21
220 machine.erian.com FTP server ready.

Nous supposons que votre machine possède un serveur FTP. Si ce n'est pas le cas, utilisez l'un de vos serveurs favoris. Le code 220 indique que la dernière opération s'est effectuée sans erreur. La connexion FTP est maintenant ouverte. Nous allons nous identifier :

USER gdw
331 Password required for gdw.
PASS motdepasse
230 User gdw logged in.

Certains serveurs FTP acceptent les connexions anonymes ; pour cela, le nom d'utilisateur est anonymous et le mot de passe est l'adresse email. Certains serveurs FTP anonymes requièrent une adresse email valides, d'autres acceptent des adresses email non valides ; cela se règle dans la configuration du serveur FTP.

Nous sommes maintenant identifiés. Tapons par exemple :

SYST
215 UNIX Type: L8
PWD
257 "/home/gdw" is current directory.
CWD tmp
250 CWD command successful.
PWD
257 "/home/gdw/tmp" is current directory.
CDUP
250 CWD command successful.

Ces commandes demandent respectivement la nature du système hôte (SYST), le répertoire courant sur le serveur (PWD), la modification du répertoire courant (CWD) sur tmp, l'affichage du répertoire courant, et le déplacement sur le répertoire parent (CDUP).

Ces commandes sont assez simples car elles n'utilisent qu'un seul canal de communication. Nous allons maintenant mettre en oeuvre une communication sur deux canaux. Pour cela, nous allons tout d'abord passer en mode passif :

PASV
227 Entering Passive Mode (127,0,0,1,167,245)

Dans ce mode, le client ne va pas se comporter comme un serveur FTP pour récupérer les informations ; cela est plus simple à mettre en oeuvre et surtout, certaines configurations réseau refusent le mode actif.

Le résultat de la commande indique que, maintenant, nous sommes en mode passif ; les nombres entre parenthèses sont importants car ils indiquent quel serveur et quel port ouvrir pour récupérer le résultat de la prochaine commande. Là, un petit calcul est nécessaire : il faut ouvrir une autre session telnet sur l'adresse IP 127.0.0.1, avec le port 167*256+245.

La commande shell suivante effectue ce calcul. Vous la taperez sur un autre terminal :

$ telnet 127.0.0.1 $(echo "167*256+245" | bc)
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

Cette commande shell est exécutée depuis un autre terminal ; elle remplace le contenu de verb$(...)} par le résultat de la commande à l'intérieur des parenthèses ; ici, on envoie au calculateur bc la demande de calcul entre guillemets.

La nouvelle session telnet est ouvert. Maintenant, si on revient sur la session telnet initiale et que l'on tape :

LIST
150 Opening ASCII mode data connection
    for /bin/ls. Trying 127.0.0.1...
226 Transfer complete.

Nous obtenons alors sur l'autre terminal l'affichage suivant :

total 466
drwxr-xr-x 17 gdw  gdw   3072 Aug  9 14:47 .
drwxr-xr-x  6 root root  1024 Apr  4 15:37 ..
-rw-------  1 gdw  gdw    373 Aug  9 14:47 .Xauthority
-rwxr-xr-x  1 gdw  gdw    172 Nov 23  1999 .Xclients
-rw-r--r--  1 gdw  gdw   4114 Mar  1 15:14 .Xdefaults
-rw-r--r--  1 gdw  gdw   2455 Oct 24  1998 .Xmodmap
-rw-r--r--  1 gdw  gdw  14054 Oct 24  1998 .Xresources
drwx------  2 gdw  gdw   1024 Jun  2 12:40 .cedit
-rwx------  1 gdw  gdw    757 Oct 24  1998 .clean
drwx------  3 gdw  gdw   1024 Aug  4 12:05 .ddd
drwxr-xr-x 15 gdw  gdw   1024 Aug  4 18:53 .dt
-rwxr-xr-x  1 gdw  gdw   5111 Nov  4  1999 .dtprofile
drwxr-xr-x  2 gdw  gdw   1024 Aug  1 00:26 .hotjava
-rw-------  1 gdw  gdw     20 Oct 24  1998 .ispell_english
-rw-------  1 gdw  gdw   1959 Jun 22 21:43 .ispell_francais
-rw-------  1 gdw  gdw    341 Jul  3 09:57 .mailcap
-rw-rw-r--  1 gdw  gdw    561 Jun 19 22:25 .mtvrc
drwxr-xr-x  8 gdw  gdw   1024 Aug  9 14:58 .netscape
-rw-rw-r--  1 gdw  gdw    728 Feb 17 18:54 .pgaccessrc
-rw-r--r--  1 gdw  gdw    268 Nov 23  1999 .profile
-rw-r--r--  1 gdw  gdw   3336 Oct 24  1998 .screenrc
-rw-r--r--  1 gdw  gdw    102 Aug 24  1999 .signature
drwx------  2 gdw  gdw   1024 Aug  4 18:19 .solregis
-rw-r--r--  1 gdw  gdw   3932 Apr  2 21:02 .twmrc
drwx------  3 gdw  gdw   1024 Jan 15  2000 .xauth
drwxr-xr-x  5 gdw  gdw   1024 May  8 18:59 Desktop
drwxrwxr-x  3 gdw  gdw   1024 Jan 31  2000 MachinaSapiens
drwxr-xr-x  5 gdw  gdw   1024 Aug  4 14:55 axhome
drwxr--r--  4 gdw  gdw   1024 Jul 28 14:37 cv
drwxr-xr-x  8 gdw  gdw   1024 Feb 24 21:00 erian
drwxr-xr-x  2 gdw  gdw   2048 Aug  2 11:13 tmp
Connection closed by foreign host.
$

Après l'affichage du résultat, la connexion est automatique terminée. Ce mode de fonctionnement est aussi utilisé pour le transfert de fichiers en entrée et en sortie. Le lecteur pourra expérimenter ces transferts.

Terminons maintenant la session FTP :

QUIT
221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 383 bytes in 0 transfers.
221-Thank you for using the FTP service on localhost.
221 Goodbye.
Connection closed by foreign host.
$

D'autres commandes FTP existent comme MKD (création de répertoire), RMD (suppression de répertoire vide), TYPE (positionnement du type de fichier en réception), RETR (récupération de fichier), DELE (suppression de fichiers), RNFR/RNTO (rennommage de fichier), STOR (envoi de fichier), etc.

L'utilisation de telnet pour faire du FTP n'est pas très aisée. Les clients FTP, comme la commande ftp, masquent ces difficultés pour offrir une interface utilisateur plus confortable. C'est justement aussi le rôle de la bibliothèque NET d'OpenScheme, avec les fonctions de la famille net:ftp exposées ci-dessous.


next up previous contents index
Next: Bibliothèque NET:FTP Up: Protocole FTP Previous: Protocole FTP   Contents   Index
© 1993 to 2001 Erian Concept