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:
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:
per què l'executi cada minut.
Que us sigui útil!!!!
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
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
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
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