Winnt is not NT

Envoyer des fichiers avec Curl

Posté le 23/08/2015

Il m’arrive parfois d’avoir à envoyer des fichiers sur mon hébergement.

Le besoin d’utiliser un logiciel ftp tel filezilla est parfois gênant. En effet, selon la taille et la vitesse d’envoi cela peut prendre un certain temps.

J’ai donc cherché une solution permettant d’utiliser un script bash et par là même cron. Je voulais au lancement du PC pouvoir lancer ou reprendre l’envoi et savoir quels fichiers avaient été envoyés.

Curl répond à ce besoin. Je vais donc exposer ici la marche suivie pour atteindre le résultat attendu.

Définition du besoin

Le besoin est simple :

Envoyer des fichiers situés dans un répertoire déterminé vers mon hébergement. Mais je ne souhaite pas inclure dans le script les nom d'utilisateur et mot de passe. L’utilisation du fichier .netrc s’impose donc (je vous laisse voir la documentation le concernant).

De plus, je souhaite qu’une fois envoyé le fichier soit supprimé afin d’éviter de multiples envois inutiles si par exemple il y a une coupure électrique avant la fin de l’exécution du script.

Dans le même but, l’utilisation de la reprise d’envoi est indispensable.

Préparation de mise en place

Afin de disposer du nécessaire pour mon projet je crée un répertoire nommé envoiftp dans lequel je déposerai les fichiers à envoyer sur mon hébergement.

cd => on se rend dans le répertoire personnel de l'utilisateur
mkdir envoiftp => on crée le répertoire d'envoi

Script de base

#!/bin/bash
cd $HOME/envoiftp
for fic in $PWD/*
do
    echo $fic
done
cd

Ce script simple permet de lister les fichiers présents dans le répertoire courant et de les afficher.

Création de la ligne de commande Curl

curl -C - --netrc --upload-file <fichier> ftp://ftp.<nom de domaine>/<répertoire destination>/

Explications de la ligne de commande

Pour s’assurer que la ligne de commande ne comporte pas d’erreur, il peut être utile de la tester.

Modification du script

#!/bin/bash
cd $HOME/envoiftp
for fic in $PWD/*
do
    curl -C - --netrc --upload-file $fic ftp://ftp.exemple.test/test/
done
cd

Avec ce script nous transférons tout les fichiers contenus dans /home/moi/envoiftp vers ftp.exemple.test/test/.

Toutefois, si une interruption du script intervient le script pourrai tenter de transférer à nouveau les fichiers déjà transférés. Pour éviter de balayer à nouveau la totalité des fichiers déjà transférés, il suffit à la fin de chaque transfert de supprimer le fichier.

Ceci amène la modification suivante du script :

#!/bin/bash
cd $HOME/envoiftp
for fic in $PWD/*
do
    curl -C - --netrc --upload-file $fic ftp://ftp.exemple.test/test/
    rm $fic
done
cd

Il ne reste plus qu’à enregistrer ce script et ajouter une ligne dans la table cron à l’aide de la commande crontab -e.

@reboot             /home/moi/scripts/envoiftp

Avec cela à chaque fois que l’on lancera le PC il ira voir s’il y a quelque chose dans le répertoire $HOME/envoiftp pour l’envoyer sur l’hébergement.

Conclusion

Voilà qui est terminé.

Cet exemple est basique, il pourrai être amélioré de plusieurs façons :

Je vous laisse faire les améliorations qui vous passent par la tête.

Commentaires

comments powered by Disqus