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!!!!

Comentarios

Gerard ha dicho que…
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 dicho que…
Doncs si.... gràcies pels comentaris que de ben segur serviran a algú altre també.

Artículos más populares

Citizen seismic stations. Earthquake monitoring and detection

Detección de ondas sísmicas PKP del terremoto de magnitud 4,9 en Tonga desde España con un acelerómetro ADXL355 a 17,640 km de distancia

Generar fichero .csv de taxonomía de Google en Español