Automatizar enviós de ficheros por Ftp

Captura_01Esta vez necesito enviar de una forma automática y programada un determinado fichero. Para ello tengo a mi disposición un espacio de almacenamiento en un servidor Ftp.

En un primer lugar opto por utilizar el cliente Ftp de Ms-DOS que aun disponen el Windows.

Mi idea es seguir los siguientes pasos:

1.- Comprimo el fichero a enviar.

2.- Envió el fichero comprimido.

3.- Elimino el fichero comprimido.

4.- Ya esto listo para otra ejecución!

Y para ello he desarrollado los siguientes ficheros:

UpLoad_File.bat:
C:\Utility\ExportZIP\7ZA465\7za.exe a -mx9 C:\Utility\ExportZIP\ExportFile.zip @C:\Utility\ExportZIP\FileList.txt
ftp -s:C:\Utility\ExportZIP\FTPConect.TXT > C:\Utility\ExportZIP\Log.txt
del C:\Utility\ExportZIP\ExportFile.zip

Realizo una compresión con 7Zip de los ficheros que deseo, para ello utilizo una lista contenida en el “FileList.txt”:

FileList.txt:
C:\Dir_01\Backup_Dir\File_Backup_01.dmp
C:\Dir_01\Backup_Dir\File_Backup_01.log

Para tener una configuración rápida y sencilla escribo un “script”, FTPConect.txt:

FTPConect.txt:
OPEN ftp://ftp.xn---server-/?-9ra.xn---com-9ia-? 21
¿-User-?
¿-Password-?
cd Intercambio
cd Dumps
binary
hash
lcd C:\Utility\ExportZIP\
put ExportFile.zip
bye

Y para posteriores verificaciones, guardo la salida e pantalla en el fichero “Log.txt”.

Para que esto se ejecute automáticamente, simplemente defino un tarea programada de Windows que ejecute el fichero “UpLoad_File.bat” a la hora deseada y listo!

Bien, hasta aquí todo correcto.

La teoría (y casi la practica) nos dice que esto totalmente correcto y funciona.

Pues bien, a la hora de probarlo me encuentro con una sorpresa, la conexión se abre correctamente y comienza a enviar, pero se queda como bloqueado, sin subir ni un solo bit.

Y me pongo la gorra de investigador y realizo las siguientes pruebas:

Realizo la conexión Ftp manualmente e intento subir el fichero, la conexión se queda congelada.

Vuelvo a realizar la conexión Ftp manualmente pero esta vez, nada mas conectarme intento ver que fichero existe en el directorio remoto (ls), el comando no responde.

Tercer intento de conexión, esta vez utilizo mi cliente Ftp preferido, FileZilla. Y el señorito se conecta sin problema!!!

Desperado!!! Reviso el log que produce FileZilla cuando trabaja en una conexión. Y llego a la conclusión de que mi fantástico cliente Ftp, el cual tengo configurado en “Modo de transferencia” “Por defecto”, el sólito se cambia a modo “Pasivo” (comando Ftp “PASV”).

Eso yo no lo tenia previsto en mi trasmisión Ftp! Asi que intento cambiar el modo en script pero el comando/cliente Ftp del Ms-DOS no permite el cambio de transferencia así que debo cambiar de cliente Ftp y debo encontrar uno que me permita ejecutarle de forma autónoma mediante scripts.

Captura_02Desgraciadamente FileZilla aun no permite hacerlo, pero hay uno igual de bueno (más o menos) e igual de barato (gratis), es WinSCP (http://winscp.net/)

Además con este cliente Ftp me ahorrare alguna línea del script ya que este obliga a configurar una conexión previa a modo de “bookmark”.

Y los comandos, los básicos, son idénticos al estándar Ftp.

Así que el script quedo de la siguiente manera:

UpLoad_File.bat:
C:\Utility\ExportZIP\7ZA465\7za.exe a -mx9 C:\Utility\ExportZIP\ExportFile.zip @C:\Utility\ExportZIP\FileList.txt
C:\Utility\ExportZIP\WinSCP\winscp419.exe /script=c:\Utility\ExportZIP\FTPConect.TXT del C:\Utility\ExportZIP\ExportFile.zip
FTPConect.TXT:
open Mi_Conextion_FTP
put c:\Utility\ExportZIP\ExportFile.zip
bye

Links interesantes:

http://www.ignside.net/man/ftp/pasivo.php

http://es.wikipedia.org/wiki/File_Transfer_Protocol

http://filezilla-project.org/

http://winscp.net/