Introduction à lftp, un client FTP en ligne de commande

le 16/09/2011 dans Linux #console#ftp#lftp#Linux#terminal

lftp est un « programme en ligne de commande de transfert de fichiers pour Unix et systèmes d'exploitation apparentés […] écrit par Alexander Lukyanov et […] distribué sous Licence publique générale GNU. » [1] Parmi ses très nombreuses fonctionnalités, lftp permet de « répliquer récursivement une arborescence entière de répertoires, l'enregistrement de signets d'adresses et la capacité à reprendre un téléchargement arrêté ». De plus, lftp « peut entièrement s'insérer dans un script au lieu d'être utilisé de manière interactive par l'utilisateur. »

Je viens de découvrir ce programme et m'en sers uniquement (pour le moment du moins) comme client FTP et de manière restreinte au vu de ses très nombreuses fonctionnalités ; cet article se contentera donc de vous aider dans vos premiers pas.

Installation

lftp n'étant pas présent par défaut sur Ubuntu, il faut commencer par l'installer :

$ sudo aptitude install lftp

Vous pouvez maintenant lancer lftp :

$ lftp

Mais que faire maintenant…

Première connexion

Une fois que vous avez ouvert lftp, vous vous trouvez face à ce prompt :

lftp :~>

Pour vous connecter à votre serveur, il vous faut utiliser la commande suivante [dans le reste de cet article, avant chaque commande, j'ajouterai la « flèche » (>) du prompt] :

> open -u LOGIN SERVER

Une fois le mot de passe saisi, vous devriez obtenir un prompt correspondant à ceci :

lftp LOGIN@SERVER:~>

Vous êtes maintenant connecté à votre serveur.

Il est à noter que vous pouvez lancer lftp tout en vous connectant à votre serveur, en une seule commande, d'au moins deux façons :

  • la commande suivante vous demandera votre mot de passe que vous aurez alors à taper sans qu'il n'apparaisse à l'écran :
$ lftp -u LOGIN SERVER
  • cette commande par contre, vous permet de tout faire d'un seul coup :
$ lftp LOGIN:PASSWORD@SERVER

Il est encore possible de faire plus simple. Une fois connecté à votre serveur, vous pouvez créer un signet [voir ci-dessous] qui pointe vers votre racine (le répertoire de base) :

> bookmark add NOM

Bien évidemment vous remplacez NOM par le nom que vous souhaitez. Ainsi, pour lancer lftp et vous connecter vous n'aurez plus qu'à saisir la commande suivante :

$ lftp NOM

 

Pour vous déconnecter, utilisez une des trois commandes suivantes :

> quit
> exit
> bye

Navigation

Bases

La navigation au sein de votre serveur avec lftp fonctionne exactement comme celle au sein de vos dossiers sur votre poste de travail avec le terminal et en reprend en partie les commandes. Notez que vous bénéficiez de l'autocomplétion tant au niveau des commandes que des noms de fichiers avec la touche tab.

Avant d'aller plus loin, appuyer deux fois sur la touche tab permet de voir l'ensemble des commandes disponibles ; parmi elles, la commande help qui lancée permet de voir l'ensemble des fonctions avec leur utilisation :

> help
    !<commande-shell>                    (commandes)                          alias [<nom> [<valeur>]]             bookmark [SOUS-COMMANDE]
    cache [SOUS-COMMANDE]                cat [-b] <fichiers>                  cd <rép-dis>                         chmod [OPTS] mode fichier...
    close [-a]                           [re]cls [opts] [chemin/][motif]      debug [<niveau>|off] [-o <fichier>]  du [options] <répertoires>
    exit [<code>|bg]                     get [OPTS] <fichier-distant> -o <fichier-local>]                          glob [OPTS] <cmd> <args>
    help [<cmd>]                         historique : -w fichier|-r fichier|-c|-l [num]                            jobs [-v]
    kill all|<num>                       lcd <répertoire-local>               lftp [OPTS] <site>                   ls [<args>]
    mget [OPTS] <fichiers>               mirror [OPTS] [distant [local]]      mkdir [-p] <répertoires>             module nom [args]
    more <fichiers>                      mput [OPTS] <fichiers>               mrm <fichiers>                       mv <fichier1> <fichier2>
    [re]nlist [<args>]                   open [OPTS] <site>                   pget [OPTS] <fichier-distant> [-o <fichier-local>]
    put [OPTS] <fichier-local> [-o <fichier-distant>]                         pwd [-p]                             queue [OPTS] [<cmd>]
    quote <cmd>                          répéter [OPTS] [delay] [command]     rm [-r] [-f] <fichiers>              rmdir [-f] <répertoires>
    scache [<num_session>]               set [OPT] [<var> [<val>]]            site <cmd_site>                      source <fichier>
    torrent [-O <répertoire>] <fichier>  user <user|URL> [<pass>]             version                              wait [<num_travail>]
    zcat <fichiers>                      zmore <fichiers>

La commande help peut prendre pour argument le nom d'une autre commande ce qui permet d'obtenir un descriptif sur cette dernière :

> help cls

De plus, les commandes semblables à celles que vous utilisez localement, sont « inversables » en les faisant précédé du caractère !. Ainsi, si pour lister les éléments présents sur votre serveur, vous utilisez cette commande :

> ls

pour lister les fichiers sur votre ordinateur vous utiliserez :

> !ls

Bien sûr, il est possible d'utiliser des options et des arguments ; ainsi :

> !ls -al REP/

Vous noterez que par défaut les options a et l sont inutiles côté serveur, la commande ls les appelant automatiquement. Si vous souhaitez lister les fichiers de votre serveur et obtenir un simple listing, utilisez la commande cls qui elle aussi peut prendre un chemin comme argument :

> cls REP/

Pour afficher récursivement le contenu du répertoire courant ou spécifié en argument, vous pouvez également utiliser la commande find.

Pour naviguer dans les répertoires distants ou locaux :

> cd REP/
> !cd REP

Par contre avec cette dernière commande (!cd REP/) le changement de dossier local n'est que temporaire ; pour que le changement de dossier local soit « retenu », il faut utiliser la commande lcd :

> lcd REP/

Si vous ne risquez pas de vous perdre dans les répertoires de votre serveur du fait du prompt, cela peut arriver sur votre poste ; pour connaître le répertoire local où vous vous trouvez :

> !pwd
/home/bbrice

Il est possible de combiner plusieurs commandes :

> cd REP/ && ls

Par contre, pour faire de même localement, il ne faut pas « échapper » (ajout du caractère !) la seconde commande :

> !cd REP/ && ls

Signets

Comme nous l'avons déjà évoqué, lftp propose un système de signets (bookmarks). Pour créer un signet sur le répertoire courant, il faut utilise la commande :

> bookmark add NOM

Pour ensuite vous rendre à ce signet :

> open NOM

Pour lister l'ensemble des signets disponibles, vous pouvez utiliser la sous-commande list mais vous pouvez vous en passer :

> bookmark

Pour effacer un signet :

> bookmark delete NOM

Vous pouvez également éditer directement la liste des signets, lftp ouvrant alors soit vi soit emacs (selon votre configuration) :

> bookmark edit

Envoi et récupération de données

Pour copier un fichier situé sur votre serveur vers le dossier local courant, il suffit de lancer la commande :

> get FILE

Par défaut, lftp attribue au fichier local le même nom que le fichier distant que l'on a copié ; pour remédier à cela, il faut alors utiliser l'option -o nom_local. De plus, il est possible de télécharger plusieurs fichiers à la fois (tout en leur attribuant un nom local différent de leur nom distant) et de spécifier le répertoire local où télécharger les fichier (option -O base) :

> get -O REP_LOCAL/ FICHIER_DISTANT1 -o NOM_LOCAL1 FICHIER_DISTANT2 -o NOM_LOCAL2

Pour envoyer un fichier local vers le répertoire courant de votre serveur, il faut utiliser la commande put :

> put FILE

Comme pour la commande get, il est possible d'uploader plusieurs fichiers tout en les renommant vers un répertoire spécifique en une seule commande :

> put -O REP_DISTANT/ FICHIER_LOCAL1 -o NOM_DISTANT1 FICHIER_LOCAL2 -o NOM_DISTANT2

Si vous avez besoin de créer un dossier [ou plusieurs], il vous faudra utiliser la commande mkdir (elle aussi « inversable » avec !) :

> mkdir REP [REP2 REP3]

Pour effacer un fichier [ou plusieurs], il faudra alors utiliser la commande rm (« inversable » aussi bien évidemment) ; pour effacer un dossier il faudra alors utiliser l'option -r (mais faîtes attention…) :

> rm FILE [FILE2 FILE3]

 

Il est également possible de dupliquer un répertoire distant vers le répertoire local et inversement grâce à la commande mirror. Pour dupliquer un répertoire distant dans le répertoire local courant :

> mirror REP_DISTANT

Notez que le répertoire local est créé automatiquement. Vous pouvez cependant spécifier un répertoire local (sans l'avoir créé précédemment) dans lequel le répertoire distant sera copié :

> mirror REP_DISTANT REP_LOCAL

L'option -R permet de dupliquer un répertoire local vers un répertoire distant :

> mirror -R REP_LOCAL/ REP_DISTANT

Attention : si vous ajoutez un slash à la fin de REP_DISTANT le répertoire local sera créé dans ce répertoire distant ; un exemple valant parfois mieux qu'un long discours, constatez la différence entre :

> mirror -R TEST/memoire/ TEMPtest
[...]
> cd
> cd TEMPtest/ && cls
css/ images/ index.php javascript/ maps/ menu.php pages/ stats.php

et :

> mirror -R TEST/memoire/ TEMPtest/
[...]
> cd TEMPtest/ && cls
memoire/
> cd TEMPtest/memoire && cls
css/ images/ index.php javascript/ maps/ menu.php pages/ stats.php

Parmi les nombreuses options de la commande mirror, nous retenons celle permettant de limiter le transfert aux seuls nouveaux fichiers, l'option -n (ou --only-newer) :

> mirror -R TEST/memoire/ TEMPtest
Total : 21 répertoires, 122 fichiers, 0 liens symboliques 
Nouveau : 122 fichiers, 0 liens symboliques
[...]
[//On créé un fichier]
> !touch TEST/memoire/TEST.php
[//On relance la duplication avec l'option -n]
> mirror -Rn TEST/memoire/ TEMPtest
Total : 21 répertoires, 123 fichiers, 0 liens symboliques 
Nouveau : 1 fichier, 0 liens symboliques

Cet article s'achève ici, dans la mesure où je suis presque à bout de ce que je connais de lftp et où cet article est déjà bien assez long… La suite au prochain épisode.