Cargando



Trabajando con FTP desde Python

En este tutorial veremos como podemos trabajar con el protocolo FTP, lograremos hacer una conexión remota, listar y subir archivos, con ello podremos lograr un mayor grado de interacción con elementos remotos, algo que no siempre es posible con programas que se pueden ejecutar de forma local dentro de nuestro equipo en desarrollo.


ene 16 2015 07:58
Profesional
ene 19 2015 00:02
Python es un lenguaje que nos permite incorporar trabajo con las diferentes funcionalidades de los sistemas operativos de forma fácil e intuitiva, esto gracias a la gran cantidad de librerías y documentación que existe en la red de forma gratuita y bien explicada.

Uno de los puntos más fuertes de este lenguaje es el trabajo con los protocolos de red, entre los cuales podemos mencionar el FTP y algo más usual como lo es el email, con ello podemos desarrollar programas o aplicaciones que nos permiten subir archivos a equipos remotos de forma automatizada si así lo deseamos, todo sin necesidad de recurrir a otras herramientas fuera del ecosistema de Python.

El protocolo FTP


El protocolo FTP nos permite hacer transferencias de archivos a través de una conexión en una red. Normalmente es el protocolo que utilizamos para conectarnos de forma remota a servidores y de esta forma manipular archivos, usualmente se utiliza el puerto 21, sin embargo esto es totalmente a gusto del consumidor por lo que si vemos otro puerto no es de extrañar que sea una instalación personalizada.

Para poder hacer interacción con este protocolo necesitamos dos cosas, la primera es un servidor que esté al aire y disponible para nuestra red, puede estar en la misma red o tal vez en Internet. Lo segundo que se necesita es un cliente que pueda enviar y recibir información de dicho servidor, este cliente debe tener la capacidad de poder utilizar los puertos especificados por el servicio y la autenticación establecida.

La librería ftplib


Realizar un cliente en Python que pueda hacer conexión FTP desde cero es posible, sin embargo el esfuerzo que eso nos tomaría sería algo considerable y al final puede ser en vano si no necesitamos algo en especial.

Para evitarnos molestias y desarrollo innecesario Python nos provee de una librería que ya nos ayuda con gran parte del trabajo. Estamos hablando de ftplib, esta contiene métodos completos y ya probados y depurados que nos facilitan la comunicación utilizando el protocolo de transferencias de archivos FTP.

¿Cómo utilizar la librería?
Para utilizar esta librería simplemente debemos incluirla en nuestro programa utilizando la instrucción import y luego empezamos nuestro desarrollo normal. En el siguiente ejemplo vamos a hacer un pequeño programa cliente que se pueda conectar a un servidor FTP, en este caso vamos a utilizar el servicio de kernel.org que es una web de Linux y con ello listaremos los archivos disponibles.


Escogemos este servidor debido a que no necesita autenticación y nos permite utilizar el modo anónimo. Veamos entonces el código y luego haremos la explicación correspondiente, el único requisito que necesitamos es tener Python 2.7 y conexión a Internet:

#!/usr/bin/env python

RUTA_SERVIDOR_FTP = 'ftp.kernel.org'
import ftplib
def cliente_ftp_conexion(servidor, nombre_usuario, correo):
#hacemos la apertura de la conexion
ftp = ftplib.FTP(servidor, nombre_usuario, correo)

#listamos los archivos del directorio /pub
ftp.cwd("/pub")
print "Archivos disponibles en %s:" %servidor
archivos = ftp.dir()
print archivos
ftp.quit()

if __name__ == '__main__':
cliente_ftp_conexion(servidor=RUTA_SERVIDOR_FTP, nombre_usuario='anonymous',
				 	 correo='nobody@nourl.com',
					 )

Lo primero que hacemos es definir una variable dentro del archivo que va a contener la ruta del servidor FTP al cual deseamos hacer la conexión, en este caso es ftp .kernel.org, aquí es donde podremos obtener información del kernel de Linux.

Acto siguiente hacemos el import de la librería ftplib antes mencionada, con ello nos aseguramos la posibilidad de utilizar todos los métodos necesarios para conectarnos al servidor antes definido, para ello utilizamos el método FTP de la misma, ahí pasaremos la ruta, el nombre de usuario y un correo.

Comprobando la conexión
Para probar que la conexión funcione hacemos uso del comando cwd para navegar hasta un directorio y luego con dir() podemos listar los archivos de dicha carpeta en el servidor, una vez que terminamos con nuestro procedimiento llamamos al método quit() para terminar la sesión y cerrar la conexión.


Este código debe ir en un archivo del nombre que deseemos con extensión .py de manera que nuestro interprete Python pueda ejecutarlo, para ello en la ruta donde se encuentre nuestro archivo lo ejecutamos con la palabra reservada python y el nombre de nuestro archivo, lo cual nos debe dar algo similar a lo que vemos en la siguiente pantalla:


Subir un archivo vía FTP


Si bien en el ejemplo anterior podemos listar los archivos de un servidor, lo cual es bastante útil para obtener información de los mismos, algo más poderoso es poder subir archivos. Las utilidades de esto son muchas, podemos contar por ejemplo la transferencia de archivos resultantes de una aplicación para su procesamiento desde otra, o tal vez hacer respaldos de un equipo en otro que se encuentre dentro de la red. Por supuesto en la actualidad tal vez hayan soluciones mucho más elegantes, sin embargo no está demás poder lograrlo con una aplicación que desarrollemos nosotros mismos.

Requisito
El requisito adicional que necesitamos para este ejercicio es tener un servidor FTP local en nuestro equipo de pruebas, para ello si contamos con un sistema Linux podemos utilizar wu-ftp, pero si estamos en plataforma Windows podemos utilizar Filezilla Server que es de uso gratuito.


Sea cual sea el servidor que podamos utilizar debemos tener permisos o la posibilidad de hacer un acceso anónimo, de todas formas en el código siguiente veremos de mejor forma como podemos hacer la subida de archivos.

Debemos crear un usuario y una cuenta FTP en el servidor local que creemos para poder hacer uso de este ejemplo, también funciona con servidores remotos, simplemente debemos asegurarnos de tener nuestras credenciales actualizadas. Luego podemos utilizar el siguiente código:

#!/usr/bin/env python

import os
import argparse
import ftplib
import getpass
SERVIDOR_FTP_LOCAL = 'localhost'
ARCHIVO_A_SUBIR = 'ejemplo.txt'
def subir_ftp(servidor, nombre_usuario, password, archivo_subir):
print "Haciendo conexion con el servidor: %s" %servidor
ftp = ftplib.FTP(servidor)
print "Iniciando sesion como: usuario=%s" %nombre_usuario
ftp.login(nombre_usuario, password)
ext = os.path.splitext(archivo_subir)[1]
if ext in (".txt", ".htm", ".html"):
	 ftp.storlines("STOR " + archivo_subir, open(archivo_subir))
else:
		 	ftp.storbinary("STOR " + archivo_subir, open(archivo_subir, "rb"),
1024)
print "Archivo subido: %s" %archivo_subir
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Ejemplo de subida de archivos FTP')
parser.add_argument('--servidor', action="store", dest="servidor", default=SERVIDOR_FTP_LOCAL)
parser.add_argument('--archivo', action="store", dest="archivo_subir", default=ARCHIVO_A_SUBIR)
parser.add_argument('--usuario', action="store", dest="nombre_usuario",default=getpass.getuser())
parametros_aplicacion = parser.parse_args()
servidor, archivo_subir, nombre_usuario = parametros_aplicacion.servidor, parametros_aplicacion.archivo_subir, parametros_aplicacion.nombre_usuario
password = getpass.getpass(prompt="Ingresa el password: ")
subir_ftp(servidor, nombre_usuario, password, archivo_subir)

En este ejemplo además de importar la librería ftplib, también importamos las librerías os para poder acceder a comandos del sistema operativo, adicionalmente utilizamos argparse y getpass para poder procesar el uso de parámetros introducidos por el usuario y así dotar de mayor dinamismo a nuestro programa.

Luego definimos un par de constantes con las cuales vamos a establecer el servidor y un archivo de ejemplo que subiremos a la carpeta definida por nuestro usuario FTP. El siguiente paso es abrir la conexión FTP, sin embargo en este caso si utilizaremos un nombre de usuario y contraseña, ya que en teoría estamos accediendo a un servidor con autenticación no anónima, esto más que todo es por motivos de seguridad y también para mostrar que nuestro ejemplo funciona en otros casos.

Continuamos evaluando la extensión de nuestro archivo, con ello veremos si es un archivo de texto, para ello utilizamos storlines(), con lo que no afectaremos el contenido del mismo, en caso de ser otra extensión diferente a las definidas utilizaremos el método storbinary() para poder pasar el archivo de forma original con su contenido binario logrando así no corromperlo y que pueda seguirse utilizando.

Finalmente utilizamos argparse() para poder tomar los argumentos que un usuario puede introducir para utilizar nuestro programa, haciendo la salvedad que si este no coloca valores se tomarán los valores globales definidos dentro de nuestro programa. Ejecutamos nuestro programa y si todo ha salido de correctamente podremos ver la siguiente salida en nuestra consola:


Notamos que en este caso el parámetro usuario es el único que utilizamos, ya que en nuestro servidor tenemos un usuario llamado prueba-python, luego introducimos el password asignado a dicho usuario y la subida del archivo es realizada efectivamente.

Con esto finalizamos este tutorial, hemos aprendido como hacer una conexión FTP desde un programa hecho en Python, lo importante acá es notar como con métodos que provienen de la librería estándar de Python hemos logrado realizar funcionalidades que de otra forma nos hubiese tardado mucho tiempo, aparte de la gran cantidad de código que habría que generar. Recomendamos seguir investigando en la documentación oficial de la librería ftplib, de esta manera subiremos de forma importante nuestras habilidades en el mundo Python, abriéndonos así las puertas a ser más efectivos como desarrolladores en este mundo tecnológico de tanta competencia.

¿Te ayudó este Tutorial?


1 Comentarios

Genial, me sirvio para aprender un poquito mas . gracias
No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X