Scripts ftp para Windows y entornos Unix/Linux

Con esta pequeña guía se pretende documentar algunos scripts prácticos que nos permiten automatizar la ejecución de comandos ftp. El manual está específicamente orientado para escenarios donde un equipo cliente necesite establecer una conexión y realizar transferencias de archivos con un servidor ftp.

Estos scripts los he tenido que usar en mi trabajo en algún momento y se utilizaban para copiar backups de un equipo a otro, normalmente ejecutados desde una tarea programada o desde un programa que se ejecutaba cada cierto tiempo. Como la ejecución es automática, es necesario especificar de antemano el servidor al cual se tiene que conectar, el nombre de usuario ftp y su respectiva contraseña, el directorio local, el directorio remoto, en fin, todos los comandos ftp que necesitamos ejecutar.

OBS: En esta guía se da por entendido que el lector ya conoce los comandos del cliente ftp, motivo por el cual no serán explicados, tampoco se abarca la instalación de un servicio ftp.
A continuación se presentan una serie de ejemplos de scripts clientes para Windows y para entornos basados en Unix/Linux.

Ejemplo para Windows

  1. Lo primero que hay que crear es un archivo de texto plano en donde se escriben todos los comandos ftp necesarios (comandos de conexión, navegación de directorios, comandos de subida y descarga de archivos, etc.). Este archivo lo podemos crear con nuestro editor preferido (nc, edit, notepad, etc.) y lo podríamos llamar comandos_ftp.txt, a continuación se presenta un contenido de ejemplo para el mismo:
    usuario_ftp
    contraseña_del_usuario
    lcd c:\
    cd /directorio_donde_se_encuentra_el_archivo_a_buscar
    ascii
    get documento_a_bajar.txt
    binary
    put archivo_a_subir.zip
    bye
  2. Una vez que tenemos el archivo con los comandos es necesario ejecutar desde el cmd la aplicación cliente ftp que se encargue de recorrer y ejecutar el contenido del archivo comandos_ftp.txt, como se muestra a continuación:
    Microsoft Windows [Versión 6.1.7600]
    Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.

    C:\Users\GK>ftp -i -s:comandos_ftp.txt dirección_ip_del_servidor_ftp
  3. Con esto ya sabemos como conectarnos a un servidor ftp y ejecutar las ordenes de un archivo de comandos, de igual manera el comando anterior se podría incluir en un archivo de ejecución .bat o ejecutarlo directamente desde una tarea programada.

Ejemplo para entornos Unix/Linux


En los entornos unix-like el procedimiento es muy similar al aplicado en el ejemplo para Windows, las diferencias son mínimas como se verá más abajo.
  1. Para comenzar creamos el archivo de comandos comandos_ftp.txt y luego lo editamos.
    testsrv:~ # touch comandos_ftp.txt
    testsrv:~ # vi comandos_ftp.txt
  2. Una vez abierto el archivo le agregamos un contenido similar al del ejemplo anterior, quedando como sigue:
    open dirección_ip_del_servidor
    user usuario_ftp contraseña_del_usuario
    lcd ~/
    cd /directorio_remoto_de_archivos
    ascii
    get documento_a_bajar.txt
    binary
    put archivo_a_subir.tar.gz
    bye
  3. y para ejecutar lo que se encuentra en el archivo comandos_ftp.txt escribimos en la consola el siguiente comando:
    testsrv:~ # ftp -n < comando_ftp.txt

Script bash con comandos FTP


También es posible crear un script bash en el cual se puede colocar de forma embebida los comandos ftp sin crear un archivo de comandos externo, esto lo podemos realizar de la siguiente forma:
  1. Primeramente creamos nuestro archivo que contendrá los comandos script bash, le asignamos unos permisos de ejecución básicos y luego lo editamos.
    testsrv:~ # touch backup_via_ftp.sh
    testsrv:~ # chmod 755 backup_via_ftp.sh
    testsrv:~ # vi backup_via_ftp.sh
  2. En este caso el script primeramente realizará una compresión del directorio /opt a modo de backup y luego lo copiará automáticamente a un servidor ftp, el contenido sería similar al que sigue:
    #!/bin/bash
    #
    # -- Declaracion de variables.

    FTP_SERVER=ip_servidor
    FTP_USER=nombre_usuario
    FTP_PASS=contraseña_usuario
    FTP_LOCAL_CD=/tmp
    BACKUP_NAME=backup_opt.tar.gz

    # -- Realizando backup de /opt.
    tar -czf $FTP_LOCAL_CD/$BACKUP_NAME /opt

    # -- Copiando archivo backup a servidor ftp.
    /usr/bin/ftp -n <<EOD
    open $FTP_SERVER
    quote USER $FTP_USER
    quote PASS $FTP_PASS
    binary
    prompt
    lcd $FTP_LOCAL_CD
    put $BACKUP_NAME
    bye
    EOD
    Enlace: Script en Github Gist.

  3. Guardamos los cambios del archivo y lo ejecutamos para probar su funcionamiento desde la consola como se muestra a continuación:
    testsrv:~ # ./backup_via_ftp.sh


Observaciones

Si utilizamos los comandos mget, mput, mdelete, etc., la directiva prompt es de mucha importancia en scripts automatizados, ya que por defecto estos comandos consultan por cada uno de los archivos al operador si desea o no transferirlos.

Si se llegan a desplegar los mensajes interactivos durante la ejecución del script automatizado, se generará una excepción que detendrá su ejecución. Algunos de los mensajes desplegados que permiten identificar el caso son similares a los siguientes:
> 'EPSV': command not understood.
> mget . [anpqy?]?

Al ejecutar antes la directiva prompt estamos desactivando el modo interactivo del cliente ftp, lo que permitirá que el script pueda transferir todos los archivos y culminar correctamente.


Fuentes

Comentarios

  1. que tal, tu post me ha ayudado mucho, gracias por compartir tus conocimientos ... tengo una duda y es la siguiente: Estoy haciendo un Script bash con comandos FTP en Ubuntu para despues programarlo y que corra cada cierto tiempo, el detalle es que quiero transferir un archivo pero hacia windows2003(no hacia otro servidor linux), pero cuando lo ejecuto me da un mensaje de error en la terminal que dice: "No Such file or directory", este es mi script:

    #!/bin/bash
    #
    # -- Declaracion de variables.
    FTP_SERVER=my_server
    FTP_USER=my_user
    FTP_PASS=my_pwd
    FTP_LOCAL_CD=C:\Inetpub\ftproot
    BACKUP_NAME=my_zip_file.zip

    # -- Copiando archivo backup a servidor ftp.
    /usr/bin/ftp -n <<EOD
    open $FTP_SERVER
    quote USER $FTP_USER
    quote PASS $FTP_PASS
    binary
    lcd FTP_LOCAL_CD
    put $BACKUP_NAME
    bye
    EOD

    Creo que mi problema es que no se va la ruta para windows2003, podrias hecharme la mano? te lo agradeceria mucho.

    saludos!

    ResponderEliminar
    Respuestas
    1. Hola, según entiendo estás tratando de conectarte con un cliente ftp desde el equipo Linux a un Windows en el que tienes corriendo el servidor ftp. Si ese es el caso deberías tener en cuenta que el comando lcd trata de ubicarse en tu equipo Linux en el directorio especificado.

      Osea, lo que probablemente esté sucediendo es que estés tratando de ubicarte en el directorio C:\Inetpub\ftproot en tu Linux y no en tu Windows, por lo que te recomendaría probar reemplazar el comando lcd por cd.

      Además también deberías cambiar el nombre de la variable FTP_LOCAL_CD por FTP_REMOTE_CD para que el nombre sea más descriptivo. En fin, tu script debería quedar similar a lo que sigue:

      #!/bin/bash
      #
      # -- Declaracion de variables.
      FTP_SERVER=my_server
      FTP_USER=my_user
      FTP_PASS=my_pwd
      FTP_REMOTE_CD=C:\Inetpub\ftproot
      BACKUP_NAME=my_zip_file.zip
      #
      # -- Copiando archivo backup a servidor ftp.
      /usr/bin/ftp -n <<EOD
      open $FTP_SERVER
      quote USER $FTP_USER
      quote PASS $FTP_PASS
      binary
      cd FTP_REMOTE_CD
      put $BACKUP_NAME
      bye
      EOD

      Espero que te haya servido, saludos!

      Eliminar
    2. Hola, gracias por la información, tengo una pregunta, donde dice BACKUP_NAME=my_zip_file.zip se le puede poner la ruta donde se encuentra el archivo que voy a enviar?

      Eliminar
    3. Hola Ana, no, la forma para posicionarte en el directorio donde se encuentra el archivo que deseas subir vía ftp a un servidor remoto es usando el comando lcd (local cd), ya que el comando cd solo sirve para posicionarse en el servidor remoto, no se si quedó del todo claro. Saludos!

      Eliminar
  2. Gracias por responder tan rapido, efectivamente ese era el problema ahora el script corre sin ningun problema.

    gracias por tu soporte, saludos!

    ResponderEliminar
  3. Disculpa y para pasar archivos desde Linux a Windows Server, se hace de forma similar???

    ResponderEliminar
    Respuestas
    1. Hola, eso depende en donde tengas instalado tu server ftp. En tu Windows podrías tener corriendo un server ftp al estilo FileZilla Server, conectarte con un script ftp cliente desde tu distro Linux y pasarle los archivos a Windows.

      O si ya tenés corriendo un servidor ftp en tu Linux al estilo Vsftpd podrías conectarte con el cliente ftp de tu server Windows y buscar los archivos desde el equipo Linux..

      En fin, queda a tu elección, saludos!

      Eliminar
  4. Hola, quisiera saber como podría descargar archivos (con directorio y todo) desde un ftp a mi pc mediante un archivo bash.

    Gracias.

    ResponderEliminar
  5. Y para guardarla en .bat y ejecutarla como debo hacerle.??

    ResponderEliminar
    Respuestas
    1. Hola Felipe, la verdad que no lo sé y tampoco tuve la necesidad de implementarlo de esa forma. Normalmente en un script .bat se puede ejecutar la aplicación ftp y pasarle los parámetros así como en el ejemplo, pero si la idea es meter las directivas ftp dentro del mismo .bat ni idea. Saludos.

      Eliminar
  6. Buenas tardes
    Por favor me pueden ayudar ... necesito hacer mi backup automatico desde un servidor ip xxx.xxx.xxx.xxx a mi equipo c:/backup/lunes>
    utilizando simbolo de sistema de mi pc ... utilizando ftp

    ResponderEliminar
  7. actualmente l hago manual utilizando ftp y mget, me toca estar pendiente por 2 horas dandole enter como 60 veces

    gracias por cualquier ayuda que me puedar dar.

    att papaluchileo

    ResponderEliminar
    Respuestas
    1. Hola, es raro que tengas que andar dando enter, con el ejemplo del script para Windows que está en el artículo más arriba y combinándolo con el comando mget supongo que debería funcionar, lo has llegado a probar? Saludos.

      Eliminar
  8. hola cordial saludo gabriel
    no habia visto tu respuesta, de acuerdo a tu consejo voy a intentar probar y te cuento :)

    ResponderEliminar
  9. Hola,
    Muy interesante y útil información, perfectamente explicado.
    lo he usado en mis servidores SuSE y perfecto.
    He usado el comandosftp.txt con prompt y mget y a la primera. para descargar un grupo grande de archivos que terminan igual (*loquesea).
    Gracias por el post!

    Un saúdo,

    ResponderEliminar
  10. si el servidor esta dentro de la misma red funcionaria ?

    ResponderEliminar
    Respuestas
    1. En principio los scripts están ideados para ser utilizados en un equipo cliente que se conecta a un servidor FTP dentro de la misma red, si la comunicación se realiza entre distintas redes o directamente a través de Internet igual debería funcionar. Ahora bien, puede que existan firewalls entre medio que bloqueen puertos y/o al protocolo FTP, por lo que podría haber casos en que no funcione.

      Saludos.

      Eliminar
  11. Hola, una consulta? tenia un script que andaba perfecto con la conexión de ssl simple, pero ahora por seguridad la cambiaron a SSL Implicit encryption, esta en winscp con windows, y nose como hacer para que funcione el script. cualquier ayuda te lo super agradesco, gracias...!

    ResponderEliminar
    Respuestas
    1. Hola edgardom, ya que el programa ftp.exe nativo de Windows no soporta comunicación SSL, supongo que ya estabas utilizando WinSCP desde el CMD como herramienta para conectarte vía protocolo ftp seguro. En éste post de Stack Overflow detallan cual es el contenido para el archivo txt y como llamarlo mediante la WinSCP, pero para serte sincero no lo he probado debido a que no tengo un entorno en el que pueda emular tu situación. Saludos.

      Eliminar

Publicar un comentario