Ludovic ROLAND

Blog technique sur mes expériences de développeur.

Intéragir avec un serveur FTP en Perl 5 (6/6) : TP : zFTP, le client FTP des zéros

12 août 2022

Nous en avons donc fini avec le protocole FTP !

Je vous propose un petit exercice de synthèse qui va vous permettre de vérifier vos connaissances sur le module Net::FTP.

Plan

L’énoncé

Le but de ce TP est de créer un client FTP ultra simplifié répondant au nom de zFTP.

Notre zFTP fonctionne suivant les étapes suivantes :

  • le programme demande à l’utilisateur se saisir les informations de connexion au serveur FTP ;
  • le programme propose un certain nombre de commandes à l’utilisateur.

Afin de faire simple, voici les fonctionnalités que notre client FTP devra implémenter :

  • se déplacer sur le serveur ;
  • savoir où l’on se trouve sur le serveur ;
  • télécharger des fichiers de l’ordinateur vers le serveur ;
  • télécharger des fichiers du serveur vers l’ordinateur ;
  • se déconnecter.

Une solution

Je vous fais part de ma solution. Bien évidemment, il ne s’agit pas de LA solution !

#!/usr/bin/perl -w

use strict;
use warnings;

use Term::ReadPassword;
use Net::FTP;
use Switch;

my $cmd;
my $arg;

#Saisie de l'hôte
print 'Hôte : ';
chomp(my $host = <STDIN>);

#Connexion au serveur
my $ftp = Net::FTP->new($host, Passive => 1) or die 'Impossible de se connecter à l\'hôte : '.$host;

#Saisie du login
print 'Login : ';
chomp(my $login = <STDIN>);

#Saisie du mot de passe
my $pwd = read_password('Password : ');

#Identification
$ftp->login($login, $pwd) or die 'Impossible de s\'identifier auprès du serveur';

do {
    print 'zFTP > ';
    chomp( $cmd = <STDIN>);

    switch($cmd) {
        #ls
        case 'ls' {
            if(my $ls = $ftp->ls()) {
                 print 'Le dossier contient '.@$ls.' élément(s) :'."\n"; 

                foreach my $elt (@$ls) {
                    print $elt."\n";
                }
            }
            else {
                warn 'Impossible de lister le contenu du dossier'."\n"; 
            }
        }
        
        #pwd
        case 'pwd' {
            if(my $pwd = $ftp->pwd()) {
                 print $pwd."\n"; 
            }
            else {
                warn 'Impossible de savoir où vous vous trouvez'."\n"; 
            }
        }

        #cwd
        case 'cwd' {
            #Saisie de l'argument
            print 'cwd > ';
            chomp($arg = <STDIN>);

            #affichage du contenu
            if($ftp->cwd($arg)) {
                print 'Déplacement fait avec succès'."\n";
            }
            else {
                warn 'Impossible d\'accéder au dossier '.$arg."\n";
            }
        }

        #get
        case 'get' {
            #Saisie de l'argument
            print 'get > ';
            chomp($arg = <STDIN>);

            #affichage du contenu
            if($ftp->get($arg)) {
                print 'Téléchargement terminé avec succès'."\n";
            }
            else {
                warn 'Impossible de télécharger le fichier '.$arg."\n";
            }
        }

        #put
        case 'put' {
            #Saisie de l'argument
            print 'put > ';
            chomp($arg = <STDIN>);

            #affichage du contenu
            if($ftp->put($arg)) {
                print 'Chargement terminé avec succès'."\n";
            }
            else {
                warn 'Impossible de charger le fichier '.$arg."\n";
            }
        }

        #qui
        case 'quit' {
            if($ftp->quit()) {
                print 'Deconnexion terminée avec succès'."\n";
            }
            else {
                 die 'Deconnexion impossible.'."\n";
            }
        }

        #Autre
        else { print 'Commande inconnue...'."\n"; }
    }
}while($cmd ne 'quit');

Le script est assez simple et commenté, je ne vais donc pas revenir en détail dessus. Tous les éléments utilisés ont été vu lors des chapitres précédents.

Si vous avez des problèmes, des doutes ou des questions, je vous encourage fortement à les poser sur le forum de ce site !

Quelques améliorations possibles

Comme toujours le programme précédent peut-être amélioré. Voici quelques idées d’améliorations :

  • ajout d’un menu listant les commandes possibles ;
  • permettre la création de fichiers et de dossiers sur le serveur ftp ;
  • permettre la suppression de fichiers et de dossiers sur le serveur ftp ;
  • permettre de renommer les fichiers manipuler avec les commandes get() et put() ;
  • permettre la saisie des commandes et des arguments en une seule ligne.

Commentaires