Page suivante Page précédente Table des matières
2. Comment télécharger automatiquement des fichiers
Internet est un immense réseau d'information mondial, ce qui est très bien, sauf lorsqu'on ne dispose que d'un accès limité, auquel cas la récupération de grosses quantités de données peut vite devenir un cauchemar. C'est le cas pour moi. Je travaille à l'observatoire astronomique de Colombie. Son réseau local ethernet est relié à l'ATM de l'université, mais la connexion avec le reste du monde passe par une liaison à 64 ko/s et cela pose un problème quand plus de 500 utilisateurs naviguent sur Internet durant la journée. La vitesse devient escargotique. La nuit, en revanche, il n'y a personne sur le campus, et le débit atteint un niveau acceptable. On peut alors télécharger facilement de grandes quantités de données, comme une distribution de Linux. Mais nous, pauvres mortels, ne pouvons passer toutes nos nuits devant un ordinateur. La solution : le programmer pour qu'il travaille quand nous dormons. Comment faire cela sur une machine linux ? C'est la question à laquelle je souhaite répondre en écrivant cet article.
Je ne traite ici que des connexions par ftp. Je n'ai pas regardé encore comment faire pour les autres protocoles. (NdT : pour rapatrier automatiquement des documents par http, on peut utiliser un outil comme wget en combinaison avec les at et nohup décrits plus bas.)
À première vue, il y a une solution intuitive : utiliser la commande
at
pour déclancher une action à moment précis. Voici comment se présente une session ftp :
bash$ ftp ftp.quelconque.fr Connected to ftp.quelconque.fr. 220 quelconque FTP server (Version wu-2.4(1) Tue Aug 8 15:50:43 CDT 1995) ready. Name (ftp.quelconque.fr:utilisateur): anonymous 331 Guest login ok, send your complete e-mail address as password. Password:(votre adresse) 230 Guest login ok, access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd pub ftp> bin ftp> get fichier.tar.gz 150 Opening BINARY mode data connection for fichier.tar.gz (3217 bytes). 226 Transfer complete. 3217 bytes received in 0.0402 secs (78 Kbytes/sec) ftp> bye 221 Goodbye. bash$On peut écrire un petit script shell contenant les opérations que
at
va exécuter. Pour passer des commandes à l'intérieur d'un programme, on peut utiliser une fonctionnalité du shell qui permet de simuler l'arrivée de donnée par l'entrée standard.
#!/bin/sh echo Nous allons utiliser un script pour passer des données à ftp. # Début du script. ftp <<** open ftp.quelconque.fr anonymous adresse@chez-moi.fr cd pub bin get fichier.tar.gz bye ** # Fin du script. echo Fin du transfert.Toutes les données entre les
**
sont passées au programmeftp
comme si elles avaient été entrées par l'utilisateur. Ce script devrait ouvrir une connexion ftp vers ftp.quelconque.fr, se logguer en tant qu'utilisateuranonymous
avecadresse@chez-moi.fr
comme mot de passe, et récupérer le fichierfichier.tar.gz
. En réalité, cela ne fonctionne pas. En effet,ftp
n'accepte pas qu'on lui communique des mots de passe par des scripts. Il va direen recevant le nom d'utilisateur et le mot de passe, et le serveur ne va pas continuer la transaction si on ne lui envoie pas ces informations.
Invalid commandIl faut utiliser pour cela un fichier caché appelé
~/.netrc
il doit être placé dans votre répertoire personnel. Il contient les informations nécessaires pour queftp
se connecte avec succès. Elles sont présentées sur 3 lignes :
machine ftp.quelconque.fr login anonymous password adresse@chez-moi.fr
Pour les connexions à des serveurs ftp privés, le mot-clef
password
doit être suivi d'un mot de passe, ce qui peut poser des problèmes de sécurité. C'est pour cette raison queftp
exige que~/.netrc
ne soit pas accessible en lecture, en écriture ou en exécution pour les autres utilisateurs. Ce qui se fait en tapant :
chmod go-rwx .netrcOn tape maintenant ce script :
#!/bin/sh echo Nous allons utiliser un script pour passer des données à ftp. # Début du script. ftp <<** open ftp.quelconque.fr cd pub bin get fichier.tar.gz bye ** # Fin du script. echo Fin du transfert.
ftp
va chercher les informations pour se connecter dans~/.netrc
. Appelez ce script autoftp, et rendez le exécutable en faisantchmod ugo+x autoftp
. On peut le lancer quand on le souhaite en tapant :
bash$ at 1:00 am autoftp (control-D) Job 70 will be executed using /bin/sh bash$Le lendemain matin, le fichier demandé sera sur votre ordinateur. On peut aussi lancer ce script comme ceci :
bash$ nohup autoftp & [2] 131 bash$ nohup: appending output to 'nohup.out' bash$
nohup
permet de laisser un processus s'exécuter même lorsqu'on se déloggue de la machine. On peut donc faire ce que l'on veut tout en rapatriant en tâche de fond une série de fichiers, voire même quitter sans tuer le processusftp
En résumé :
- Mettez le nom du serveur, l'utilisateur et le mot de passe dans le fichier
~/.netrc
.- Ecrivez un script sur ce modèle :
#!/bin/sh ftp <<** open machine.domaine.fr ...suite de commandes... bye **- Programmez son exécution retardée :
at 1:00 am le_script (control-D)Et voilà.
On peut peut aussi compliquer un peu le script, pour qu'il mette à jour automatiquement le fichier
~/.netrc
et qu'il tienne un fichier de journal :
#!/bin/sh # Sauvegarde l'ancien ~/.netrc cp $HOME/.netrc $HOME/netrc.bak # Configures un nouveau ~/.netrc rm $HOME/.netrc echo machine ftp.quelconque.fr > $HOME/.netrc echo login anonymous >> $HOME/.netrc echo password adresse@chez-moi.fr >> $HOME/.netrc chmod go-rwx $HOME/.netrc echo ficher de journal d'autoftp > autoftp.log echo Début de la connexion : >> scriptname.log date >> scriptname.log ftp -i<<** open ftp.quelconque.fr bin cd pub get fichier1.tar.gz get fichier2tar.gz bye ** echo Fin de la connexion : >> scriptname.log date >> scriptname.log # Fin du script autoftp.Faire un tel script à la main à chaque fois se révèle vite assez fastidieux, et j'ai créé pour automatiser la tâche une application en
tcl/tk8.0
qui fabrique le script en fonction des besoins.
Publié dans le Numéro 34 de la Linux Gazette en novembre 1998.
Adaptation française: Marc Simon <msimon@astrolabe.frmug.org>
Page suivante Page précédente Table des matières