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/

Anuncios

Acerca de Robert Ale
Soy yo un simple tipo que quiere estar en la red... aunque no se si lo conseguiré algún día...

5 Responses to Automatizar enviós de ficheros por Ftp

  1. Ronald says:

    Ya estas en la red

  2. Raul says:

    Realice al pie de la letra lo que indicaste y funciona en parte, pues la primera vez transfiere el archivo, pero cuando se trata de transferir nuevamente el mismo archivo con la misma cantidad de byte pero mas nuevo no lo hace, pense entonces en borrar primero ese archivo y luego transmitir el nuevo para evitar el problema pero no funciona el comando delete que se le coloca en el archivo .txt, podrias ayudarme con ese detalle. Gracias

  3. jorge says:

    x lo que entiendo… en Filezilla no permite Script’s, mi duda es…
    Hay alguna manera de automatizar los servidores a los que me quiero conectar (FTP), es decir; tengo 130 server, a los cuales quiero mandar archivos a la misma ruta (diferente IP) pero de weba la conexion uno x uno.
    Espero haya respuesta!!!!

    • Robert Ale says:

      Hola, Jorge!

      Hasta donde yo se Filezilla no admite script para manejar ficheros (creo que solo para establecer conexiones).

      Yo tuve un problemas similar y se me ocurrió la idea que explico en esta entrada. Utilizar WinSCP.

      Y sobre tu “problema”…
      Por lo que entiendo tienes que subir unos ficheros a unos 130 servidores y lo bueno es que la ubicación en los 130 servidores es la misma.

      A mi se me ocurre.

      Aprovechando que los ficheros se dejan en las mismas ubicaciones (distintos servidores). Preparar un script generico de envío de ficheros. Es decir, un script que te valga para subir los ficheros a los 130 servidores.
      A ese script lo llamamos “paso_02txt”.

      Y solo nos quedaría solucionar las 130 conexiones.
      Tener que definir 130 conexiones en WinSCP una por una nos puede causar un sincope.

      Si leemos un poco la siguiente dirección:
      http://winscp.net/eng/docs/scriptcommand_open
      Vemos como hacer la conexión.

      Pues en un batch, un vbscript, o cualquier otro sistema de programación desarrollas un bucle que que te vaya creando un fichero (otro scrip) porque cada conexión.
      A ese script lo llamamos “paso_01txt”.

      Y con un simple batch unimos esos 2 ficheros en uno solo:
      type paso_01.txt > paso_00.txt
      type paso_02.txt >> paso_00.txt

      Y asi solo quedaria ejecutar, uno por uno, servidor por servidor, el script:
      C:\Utility\ExportZIP\WinSCP\winscp419.exe /script=c:\paso_00.txt

      Esto ultimo no lo he probado pero que funcione.

      Se resumen:

      Creamo un batch o vbscript, etc… que nos permita crear servidor por servidor una ficheros de conexión (paso_01.txt).
      Dentro de este batch:
      – Añadimos la unión entre “paso_01.txt” y “paso_02.txt” (paso_02.txt es generico y siempre el mismo).
      – Añadimos la ejecución de de WinSCP.

      Saludos y muchas gracias por acercarte a este blog”

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: