dijous, 23 de setembre de 2010

Enviament de fitxers per ftp mitjançant bash i cron

Avui he solventat un problema que el Windows no podia fer (o feia a mitges), i ho solventat amb GNU/Linux.

Resulta que un client té una estació meteorològica DAVIS, que mitjançant un software, genera unes dades que s'han d'enviar a un servidor local i també cap a internet mitjançant ftp. El propi software té els serveis per fer-ho, però el problema està en que aquesta màquina virtual corre sobre un windows 2003 server, i de tant en tant queda col.lapsada.

La sol.lució ha estat crear mitjançant un GNU/Linux un arxiu bash per copiar les dades del pc que les genera i enviar-les per ftp.

Tenim l'ordinador windows (192.168.1.5) que és el que genera els fitxers, amb la carpeta on estan aquests fitxers, compartida a la xarxa que es diu fitxers_creats . Els fitxers que hem d'enviar per ftp són:

clientraw.txt
clientrawhour.txt
clientrawextra.txt
clientrawdaily.txt

Hem de crear un directori a l'arrel del GNU/Linux per poder muntar el directori windows. Li direm /ftp_meteo

Primer de tot, tenim el fitxer enviament_ftp.sh:

#!/bin/bash
HOST="ftp.servidor.com"
USER="usuari_ftp"
PASSWD="password_ftp"

# copiem els fitxers de la xarxa localment

if
mount -t cifs //192.168.1.5/fitxer_creats/ /ftp_meteo -o iocharset=utf8,username=usuari_windows,password=password_windows
then
cp /ftp_meteo/clientraw.txt /root/clientraw.txt
cp /ftp_meteo/clientrawhour.txt /root/clientrawhour.txt
cp /ftp_meteo/clientrawextra.txt /root/clientrawextra.txt
cp /ftp_meteo/clientrawdaily.txt /root/clientrawdaily.txt

umount /ftp_meteo
fi

#Directorio local
BACKUP="/root"

#Directorio remoto
REMOTE="/html"

cd $BACKUP

ftp -n -v $HOST << EOT
binary
user $USER $PASSWD
prompt

mput clientraw.txt
mput clientrawhour.txt
mput clientrawextra.txt
mput clientrawdaily.txt
bye
bye
EOTp_$$.log


Us explico el funcionament:
Les dades del servidor ftp les heu de configurar al principi de tot:
HOST="ftp.servidor.com"
USER="usuari_ftp"
PASSWD="password_ftp"


A continuació, el sistema munta el sistema de fitxers windows a la carpeta /ftp_meteo que prèviament hem creat. Aquí s'enviarà també l'usuari i password del sistema windows per què ens deixi accedir a la carpeta:
if
mount -t cifs //192.168.1.5/fitxer_creats/ /ftp_meteo -o iocharset=utf8,username=usuari_windows,password=password_windows
then


Jo he utilitzat el propi usuari root per copiar els fitxers... si ho voleu fer d'una manera més neta, veureu que és fàcil modificar el codi:

cp /ftp_meteo/clientraw.txt /root/clientraw.txt
cp /ftp_meteo/clientrawhour.txt /root/clientrawhour.txt
cp /ftp_meteo/clientrawextra.txt /root/clientrawextra.txt
cp /ftp_meteo/clientrawdaily.txt /root/clientrawdaily.txt

umount /ftp_meteo

 
Al final de tot hem desmuntat el directori windows de la carpeta /ftp_meteo.

A continuació li direm en quin directori es troben els fitxers que volem copiar i el directori destí remot:
BACKUP="/root"
REMOTE="/html"

 i entrem a aquest directori:

cd $BACKUP 

 La següent part serveix realment per connectar-nos al server i enviar-li totes les línies mitjançant ftp, utilitzant les dades del servidor ftp que hem definit a l'inici i entrant al directori remot del servidor ftp:

ftp -n -v $HOST << EOT
binary
user $USER $PASSWD
prompt



cd $REMOTE

mput clientraw.txt
mput clientrawhour.txt
mput clientrawextra.txt
mput clientrawdaily.txt
bye
bye
EOTp_$$.log
 

recordeu fer-lo executable: chmod +x  enviament_ftp.sh

Amb això ho enviem una sola vegada, però a nosaltres ens interessava enviar-lo cada 20 segons, per tant, hem creat un segon fitxer bash que cridarà al primer cada 20 segons 3 vegades per què ens interessa que ho faci només durant un minut (20 segons * 3 vegades són 60 segons que dura un minut). Aquest és el segon fitxer bash enviament_while_ftp.sh:

#!/bin/bash

LIMITE=3

a=1

while [ "$a" -le $LIMITE ]
do
  sh /root/enviament_ftp.sh
  sleep 20
  a=$(( $a + 1 ))
done


recordeu fer-lo executable: chmod +x  enviament_while_ftp.sh
 
Aquest codi el que fa és repetir rins a 3 vegades l'execució del fitxer enviament_ftp.sh. Cada vegada que s'executa, s'espera 20 segons per fer la següent execució.

Només falta afegir una línia al fitxer /etc/crontab:

* * * * * root sh /root/enviament_while_ftp.sh  > /dev/null 2>&1

per què l'executi cada minut.

Que us sigui útil!!!!

2 comentaris:

galco ha dit...

Hola Rafael,

també ho podies fer així:

0,20,40 * * * * root sh /root/enviament_ftp.sh > /dev/null 2>&1

o així:

0-59/20 * * * * root sh /root/enviament_ftp.sh > /dev/null 2>&1

Precisament el cron és un artista per repetir les coses cada x temps.

Salut!

--
Gerard

Rafael Martín ha dit...

Doncs si.... gràcies pels comentaris que de ben segur serviran a algú altre també.

 
Tira Ecol