Code source wiki de Lftp transfert de fichiers pour Unix
Afficher les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
| 1 | # Manuel de lftp | ||
| 2 | |||
| 3 | **lftp** est un logiciel de transfert de fichiers en ligne de commande. Il est puissant et fiable, et très utile dans le contexte de la gestion de serveurs distants. Il supporte les protocoles FTP, HTTP, FISH, SFTP, HTTPS et FTPS. | ||
| 4 | |||
| 5 | Il vient avec un fichier de configuration /etc/lftp.conf que l'on peut utiliser comme base pour une personnalisation. Il contient de nombreux exemples commentés. | ||
| 6 | |||
| 7 | Le fichier de configuration personnel doit être créé sous `$HOME/.config/lftp/`. Voici un exemple de fichier lftp.conf personnalisé: | ||
| 8 | |||
| 9 | ``` | ||
| 10 | # Pour plus d'options vérifier les commentaires dans le fichier /etc/lftp.conf | ||
| 11 | # set ftp:ssl-allow false | ||
| 12 | # set xfer:clobber "on" | ||
| 13 | set ssl:verify-certificate no | ||
| 14 | set ftp:ssl-force yes | ||
| 15 | set ftp:anon-pass "mozilla@" | ||
| 16 | ``` | ||
| 17 | |||
| 18 | La documentation officielle se trouve sur <https://lftp.yar.ru/> | ||
| 19 | |||
| 20 | <div style="height:1.5em;"></div> | ||
| 21 | |||
| 22 | # Commandes de base | ||
| 23 | |||
| 24 | ## FTP | ||
| 25 | |||
| 26 | * `lftp <ftp://login@ip>` # connexion à la racine du serveur | ||
| 27 | * `lftp <ftp://login@ip:/repertoire-cible>` # connexion directe répertoire destination | ||
| 28 | * `lftp <ftp://login@ip/repertoire-cible>` # idem sans le signe ':' | ||
| 29 | |||
| 30 | Le mot de passe est demandé interactivement après connexion. | ||
| 31 | |||
| 32 | <div style="height:1.5em;"></div> | ||
| 33 | |||
| 34 | ## SFTP | ||
| 35 | |||
| 36 | Pareil que ci-dessus, mais avec `lftp sftp://…` | ||
| 37 | |||
| 38 | <div style="height:1.5em;"></div> | ||
| 39 | |||
| 40 | ## Commandes de navigation et d'information | ||
| 41 | |||
| 42 | * `pwd` # affiche le répertoire courant (distant) | ||
| 43 | * `lpwd` # affiche le répertoire courant (local) | ||
| 44 | * `ls` # liste les fichiers distants | ||
| 45 | * `lcd` # affiche le répertoire local courant en essayant de changer de répertoire local | ||
| 46 | * `!ls` # liste les fichiers locaux (! = exécution locale) | ||
| 47 | * `cd repertoire` # change de répertoire distant | ||
| 48 | * `lcd repertoire` # change de répertoire local | ||
| 49 | |||
| 50 | <div style="height:1.5em;"></div> | ||
| 51 | |||
| 52 | ## Transferts de fichiers | ||
| 53 | |||
| 54 | * `get <fichier>` # télécharge le fichier distant choisi dans le répertoire local courant | ||
| 55 | * `get <fichier> -o /chemin/local/` # télécharge le fichier distant choisi vers un répertoire local spécifique | ||
| 56 | * `put <fichier>` # envoie le fichier local choisi vers le répertoire distant courant | ||
| 57 | * `mget <fichier1 fichier2 fichier3…>` # télécharge plusieurs fichiers choisis dans le répertoire local courant | ||
| 58 | * `mput <fichier1 fichier2 fichier3…>` # envoie plusieurs fichiers choisis vers le répertoire distant courant | ||
| 59 | |||
| 60 | <div style="height:1.5em;"></div> | ||
| 61 | |||
| 62 | ## Transferts de répertoires complets | ||
| 63 | |||
| 64 | Connecté au serveur : | ||
| 65 | |||
| 66 | * `lftp login@serveur:/repertoire> mirror <dossier-distant> <dossier-local/>` # télécharge un répertoire complet dans le répertoire local courant | ||
| 67 | * `lftp login@serveur:/repertoire> mirror --reverse <dossier-local/> <dossier-distant>` # envoie le contenu d'un répertoire local complet vers le serveur distant | ||
| 68 | * `lftp login@serveur:/repertoire> mirror --reverse <dossier-local> <dossier-distant>` # envoie un répertoire local complet vers le serveur distant | ||
| 69 | |||
| 70 | <div style="height:1em;"></div> | ||
| 71 | |||
| 72 | * `mirror --continue` # reprend un transfert interrompu | ||
| 73 | * `mirror --delete` # supprime à la destination ce qui n'existe plus à la source | ||
| 74 | * `mirror --parallel=4` # transferts parallèles | ||
| 75 | |||
| 76 | <div style="height:1.5em;"></div> | ||
| 77 | |||
| 78 | ### Transferts parallèles | ||
| 79 | |||
| 80 | --parallel=N lance N transferts simultanément au lieu d'un seul à la fois. Utile pour les répertoires avec beaucoup de petits fichiers → au lieu d'attendre que chaque fichier soit terminé avant de passer au suivant, lftp en transfère plusieurs en même temps. | ||
| 81 | |||
| 82 | Connecté au serveur : | ||
| 83 | |||
| 84 | lftp login@serveur:/repertoire> mirror --parallel=4 <dossier-distant/> <dossier-local/> | ||
| 85 | |||
| 86 | =>le prompt est bloqué jusqu'à la fin du transfert. | ||
| 87 | |||
| 88 | <div style="height:1.5em;"></div> | ||
| 89 | |||
| 90 | Dans lftp interactif, lancer un mirror en arrière-plan : | ||
| 91 | |||
| 92 | lftp login@serveur:/repertoire> mirror --parallel=4 <dossier-distant/> <dossier-local/> & | ||
| 93 | |||
| 94 | => avec le signe '&' le prompt revient immédiatement, le transfert continue en arrière-plan. On peut continuer à taper des commandes selon le besoin. | ||
| 95 | |||
| 96 | <div style="height:1.5em;"></div> | ||
| 97 | |||
| 98 | ## Divers | ||
| 99 | |||
| 100 | * `jobs` # affiche les transferts en cours | ||
| 101 | * `wait` # attend la fin des transferts en cours | ||
| 102 | * `queue` # met des commandes en file d'attente | ||
| 103 | * `exit / quit` # quitte lftp | ||
| 104 | |||
| 105 | <div style="height:1.5em;"></div> | ||
| 106 | |||
| 107 | ### Divers - Utilisation concrète | ||
| 108 | |||
| 109 | _jobs_, _wait_ et _queue_ sont utiles quand on lance un transfert en tâche de fond depuis le prompt lftp, pour continuer à naviguer pendant ce temps : | ||
| 110 | |||
| 111 | * `jobs` # voir l'état du transfert en cours | ||
| 112 | * `wait` # bloquer jusqu'à ce que le transfert soit terminé | ||
| 113 | |||
| 114 | _queue_ permet d'enchaîner des commandes qui s'exécuteront l'une après l'autre : | ||
| 115 | |||
| 116 | * `queue mirror /rep1/ /dest1/` | ||
| 117 | * `queue mirror /rep2/ /dest2/` | ||
| 118 | * `queue mirror /rep3/ /dest3/` | ||
| 119 | * `wait` | ||
| 120 | |||
| 121 | Ci-dessus lftp exécute les trois _mirrors_ séquentiellement sans intervention. | ||
| 122 | |||
| 123 | <div style="height:1.5em;"></div> | ||
| 124 | |||
| 125 | Mettre chaque queue en arrière-plan si on ne veut pas employer "wait" : | ||
| 126 | |||
| 127 | * `queue mirror /rep1/ /dest1/ &` | ||
| 128 | * `queue mirror /rep2/ /dest2/ &` | ||
| 129 | * `queue mirror /rep3/ /dest3/ &` | ||
| 130 | |||
| 131 | /!\ là les trois tournent en parallèle simultanément : Si les trois destinations sont sur le même serveur risque de satureration de la connexion et/ou refus du serveur FTP /!\ | ||
| 132 | |||
| 133 | => wait après les queues est recommandé en cas de transferts vers le même serveur. | ||
| 134 | |||
| 135 | <div style="height:1.5em;"></div> | ||
| 136 | |||
| 137 | ## Transferts de répertoires complets : syntaxe et options | ||
| 138 | |||
| 139 | Depuis le prompt lftp, déjà connecté au serveur source : | ||
| 140 | |||
| 141 | mirror repertoire-source/ /chemin/local/repertoire-destination/ | ||
| 142 | |||
| 143 | ou | ||
| 144 | |||
| 145 | mirror repertoire-source /chemin/local/ | ||
| 146 | |||
| 147 | => La présence du slash final `/` détermine le résultat | ||
| 148 | |||
| 149 | <div style="height:1.5em;"></div> | ||
| 150 | |||
| 151 | À garder en tête pour la lecture des exemples suivants : | ||
| 152 | |||
| 153 | * Avec `repertoire-source/` le contenu du répertoire est copié dans la destination, mais pas le répertoire lui-même. | ||
| 154 | * Avec `repertoire-source` le répertoire complet est copié dans la destination, contenu inclus. | ||
| 155 | * Le signe `~/` pour "home" sera à adapter en fonction de votre cas | ||
| 156 | * Préférez toujours vous déplacer dans le répertoire de travail, qu'il soit local ou distant | ||
| 157 | |||
| 158 | <div style="height:1.5em;"></div> | ||
| 159 | |||
| 160 | Depuis le terminal bash, non connecté, récupère le contenu complet du répertoire distant: | ||
| 161 | |||
| 162 | lftp -e "mirror <sftp://login:mdp@serveur:/repertoire-source/> /repertoire-local/destination/ ; quit" | ||
| 163 | |||
| 164 | <div style="height:1.5em;"></div> | ||
| 165 | |||
| 166 | ### Options | ||
| 167 | |||
| 168 | * `--reverse` : inverse le sens du transfert : envoie du local vers le distant | ||
| 169 | |||
| 170 | Ex : `mirror --reverse ~/repertoire-local/ repertoire-distant/` | ||
| 171 | |||
| 172 | <div style="height:1.5em;"></div> | ||
| 173 | |||
| 174 | * `--continue` : reprend un transfert interrompu, ne retransfère que ce qui manque ou a été modifié | ||
| 175 | |||
| 176 | Ex : `mirror --continue ~/repertoire-source/ /repertoire-local/destination/` | ||
| 177 | |||
| 178 | <div style="height:1.5em;"></div> | ||
| 179 | |||
| 180 | * `--delete` : supprime à la destination les fichiers qui n'existent plus à la source — à utiliser avec précaution | ||
| 181 | |||
| 182 | Ex : `mirror --delete ~/repertoire-source/ /repertoire-local/destination/` | ||
| 183 | |||
| 184 | <div style="height:1.5em;"></div> | ||
| 185 | |||
| 186 | * `--parallel=N` : lance N transferts simultanément — utile pour les répertoires contenant de nombreux petits fichiers | ||
| 187 | |||
| 188 | Ex : mirror --parallel=4 ~/repertoire-source/ /repertoire-local/destination/ | ||
| 189 | |||
| 190 | <div style="height:1.5em;"></div> | ||
| 191 | |||
| 192 | * `--verbose` : affiche chaque fichier transféré au fur et à mesure | ||
| 193 | |||
| 194 | Ex : mirror --verbose ~/repertoire-source/ /repertoire-local/destination/ | ||
| 195 | |||
| 196 | <div style="height:1.5em;"></div> | ||
| 197 | |||
| 198 | `--log=fichier.log` : enregistre les opérations effectuées dans un fichier : /!\ ne capture pas les erreurs (utiliser la redirection 2>&1 pour cela) /!\ | ||
| 199 | |||
| 200 | Ex : mirror --log=transfert.log ~/repertoire-source/ /repertoire-local/destination/ | ||
| 201 | |||
| 202 | <div style="height:1.5em;"></div> | ||
| 203 | |||
| 204 | ## Mirroring entre deux serveurs distants | ||
| 205 | |||
| 206 | Transfert direct d'un serveur vers un autre, sans passer par le local. La commande s'écrit en une seule ligne depuis le terminal bash, avec les deux URIs complètes — le premier argument est la **source**, le second est la **destination** : | ||
| 207 | |||
| 208 | lftp -e "mirror --continue --verbose <sftp://login:mdp@serveur1/repertoire-source/> <ftp://login:mdp@serveur2/repertoire-destination/> ; quit" | ||
| 209 | |||
| 210 | Les protocoles source et destination peuvent être différents (sftp, ftp, ftps), lftp gère la conversion de façon transparente. | ||
| 211 | |||
| 212 | /!\ À noter : Les mots de passe apparaissent en clair dans la ligne de commande /!\ | ||
| 213 | |||
| 214 | De là, si besoin, pour éviter l'enregistrement dans l'historique bash, préfixer la commande d'un espace. Cela nécessite que `HISTCONTROL` soit défini à `ignorespace` ou `ignoreboth` : | ||
| 215 | |||
| 216 | `lftp -e "mirror --continue --verbose <sftp://login:mdp@serveur1/repertoire-source/> <ftp://login:mdp@serveur2/repertoire-destination/> ; quit"` | ||
| 217 | |||
| 218 | => Le slash final sur les deux URIs est important : il garantit que le contenu du répertoire source va dans le répertoire destination, et non que le répertoire source est recréé à l'intérieur. | ||
| 219 | |||
| 220 | => Différence entre `; quit` et `&& quit` : | ||
| 221 | |||
| 222 | * `; quit` : quitte dans tous les cas en fin de transfert | ||
| 223 | * `&& quit` : ne quitte que si le mirror s'est terminé sans erreur | ||
| 224 | |||
| 225 | => Sans `--delete`, le mirror est additif : il n'efface rien à la destination. | ||
| 226 | |||
| 227 | => Pour capturer les erreurs dans un fichier log, rediriger stdout et stderr : | ||
| 228 | |||
| 229 | lftp -e "mirror --continue --verbose <sftp://login:mdp@serveur1/repertoire-source/> <ftp://login:mdp@serveur2/repertoire-destination/> && quit" > transfert.log 2>&1 | ||
| 230 | |||
| 231 | ## Quitter la connexion | ||
| 232 | |||
| 233 | lftp login@serveur:/repertoire> bye | ||
| 234 | |||
| 235 | ou `quit` ou `exit` | ||
| 236 | |||
| 237 | --- | ||
| 238 | |||
| 239 | /!\ **Détail** : Le man ne mentionne pas _bye_, il ne documente que _exit_ et _quit_ implicitement via « ftp:use-quit ». | ||
| 240 | |||
| 241 | Ce que le man dit sur _exit_ : si des jobs sont en arrière-plan, _exit_ détache lftp du terminal et le fait continuer en arrière-plan (comportement similaire à _nohup_) plutôt que de tout tuer : les transferts continuent. | ||
| 242 | |||
| 243 | Par ailleurs _exit kill_ force l'arrêt de tous les jobs avant de quitter. | ||
| 244 | |||
| 245 | **À vérifier** : _bye_ pourrait être un alias de _exit_ ou de _quit_ hérité de la tradition FTP (les serveurs FTP répondent souvent _bye_ à la déconnexion), mais le man ne le mentionne pas. |