Cómo conectarse a un servidor FTP usando Python

Cómo conectarse a un servidor FTP usando Python

FTP (Protocolo de transferencia de archivos) no necesita presentaciones: se encuentra entre los métodos de transferencia de archivos más utilizados entre uno o más clientes y un servidor. Por diseño, es compatible con el acceso anónimo y la autenticación, pero en su forma más básica no proporciona cifrado de datos, por eso a menudo se asegura a través de TLS.

Muchas aplicaciones de clientes FTP están disponibles en Linux, como por ejemplo Filezilla (gráfico) o LFTP (línea de comando). A veces, sin embargo, es posible que deseemos acceder a un servidor FTP programáticamente, tal vez para programar transferencias de archivos. Una manera fácil de hacerlo es usar un lenguaje de programación como Python. En este tutorial aprenderemos a usar el ftplib Biblioteca para interactuar con un servidor FTP.

En este tutorial aprenderás:

  • Cómo crear una instancia del FTPLIB.Clase FTP
  • Cómo enumerar archivos en un servidor FTP remoto
  • Cómo cargar archivos en modo binario y de "líneas"
  • Cómo descargar archivos en modo binario y "líneas"
  • Cómo crear, eliminar y cambiar el nombre de directorios y archivos
  • Cómo cambiar el directorio de trabajo
Cómo conectarse a un servidor FTP usando Python

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Distribución independiente
Software Pitón
Otro No se requieren otros permisos
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
$-Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

La biblioteca ftplib

El ftplib El módulo es parte de la biblioteca estándar de Python, y proporciona dos clases principales para trabajar abstracto con una conexión FTP: ftblib.Ftp y ftplib.Ftp_tls. Este último es una subclase del primero y agrega soporte para TLS. Veamos algunos de los casos de uso más comunes de la biblioteca.

Conectarse a un servidor FTP

Para conectarse a un servidor FTP, lo primero que tenemos que hacer es crear una instancia del Ftp clase. La clase admite el con instrucción para que se pueda usar con un administrador de contexto: de esta manera, la conexión se cerrará automáticamente cuando terminemos de trabajar o ocurra un error. Aquí hay un ejemplo de uso:

con ftplib.Ftp ('ftp.de alguna manera.com ') como ftp: # codehere 
Copiar

Todos los parámetros del Ftp El constructor de clases es opcional, sin embargo, aquí proporcionamos el primer argumento aceptado por él, que es el anfitrión Queremos conectarnos a. Si se proporciona el argumento, el conectar El método, utilizado para establecer una conexión con el servidor, se llama implícitamente con el host especificado aprobado como argumento, de lo contrario, debe llamarse explícitamente:

con ftplib.Ftp () como ftp: ftp.conectar ('ftp.de alguna manera.com ') 
Copiar

El segundo argumento aceptado por el Ftp El constructor de clases es el usuario Queremos iniciar sesión como en el servidor FTP. Proporcionar este argumento causará el acceso método para ser llamado implícitamente con el usuario, el contraseña y accidente Los valores aprobados como argumentos (son el tercer y cuarto parámetros del constructor de clase, y predeterminados a una cadena vacía como valor):

con ftplib.Ftp ('ftp.de alguna manera.It ',' testUser ',' testPassword ') como ftp: # codehere 
Copiar

Si no se proporciona el argumento, el acceso El método debe llamarse explícitamente:

con ftplib.Ftp ('ftp.de alguna manera.it ') como ftp: ftp.Iniciar sesión ('testuser', 'contraseña') 
Copiar

Obtener una lista de archivos en el servidor

Una vez un Ftp Se crea el objeto, básicamente tenemos tres formas de obtener una lista de los archivos almacenados en el servidor FTP al que estamos conectados. En primer lugar, podemos usar el prostituta método, que produce un listado de directorio como devuelto por el LISTA dominio:

>>> con ftplib.Ftp ('ftp.de alguna manera.it ',' user ',' contraseña ') como ftp: ... ftp.dir () 
Copiar

El prostituta El método acepta un argumento opcional, que es el directorio de la lista (el valor predeterminado es el directorio de trabajo actual, por lo que en este caso la raíz FTP). El código anterior produce una salida similar a la siguiente:

DRWXR-XR-X 2 FTP FTP 4096 Oct 13 14:37 . DRWXR-XR-X 2 FTP FTP 4096 Oct 13 14: 37… -RW ------- 1 ftp ftp 10 sep 10 06:04 .ftpquota -rw-r-r-- 1 ftp ftp 5306756 18 de octubre 01:32 archivo.CSV 

El segundo método que podemos usar para obtener una lista de archivos es TRABAJO. Como su nombre indica, este método, debajo del capó, envía un TRABAJO comando al servidor; Devuelve una lista de Python que contiene el nombre de los archivos como miembros:

>>> con ftplib.Ftp ('ftp.de alguna manera.it ',' user ',' contraseña ') como ftp: ... ftp.nlst () ... [.',' ... ','.archivo ftpquota ','.CSV '] 
Copiar

El tercer método que podemos usar para obtener para enumerar el contenido de un directorio es MLSD. Este método usa el MLSD Comando (para que funcione, el servidor debe admitirlo) y acepta dos argumentos opcionales:

  • El camino del directorio que debe estar en la lista
  • Una lista de la información que queremos ser incluida en el resultado

El método devuelve un generador que produce un Tuple de dos elementos Para cada archivo: el primer elemento de cada tupla es el Nombre del archivo; el segundo a diccionario que contiene la información solicitada y sus valores. Veamos un ejemplo:

>>> con ftplib.Ftp ('ftp.de alguna manera.it ',' user ',' contraseña ') como ftp: ... para nombre de archivo, información en FTP.MLSD (): ... Imprimir (nombre de archivo, información) 
Copiar

La salida del código anterior es el siguiente:

. 'type': 'Cdir', 'Sizd': '4096', 'Modify': '20201013123732', 'Unix.modo ':' 0755 ',' Unix.uid ':' 1809 ',' Unix.Gid ':' 1811 ',' único ':' fd04g58e0a67 ' ... ' type ':' pDir ',' sizd ':' 4096 ',' modificar ':' 20201013123732 ',' unix.modo ':' 0755 ',' Unix.uid ':' 1809 ',' Unix.Gid ':' 1811 ',' único ':' fd04g58e0a67 ' .ftpquota 'type': 'file', 'size': '10', 'modificar': '20200910040430', 'Unix.modo ':' 0600 ',' Unix.uid ':' 1809 ',' Unix.Gid ':' 1811 ',' único ':' FD04G58E0A9D '.csv 'type': 'file', 'size': '5306756', 'modificar': '20201017233245', 'unix.modo ':' 0644 ',' Unix.uid ':' 1809 ',' Unix.Gid ':' 1811 ',' único ':' fd04g58e020a ' 

Observe que el servidor no está garantizado para respetar la lista de información que solicitamos.

Recuperar archivos del servidor

Para recuperar archivos del servidor, podemos usar el retrbinario o replante métodos. Veamos cómo funcionan.

El retrbinario El método recupera un archivo en modo de transferencia binaria: esto es lo que desea usar para simplemente descargar un archivo desde el servidor a su máquina local y no necesita interactuar con su contenido. Veamos un ejemplo de su uso. Digamos que queremos descargar el archivo.CSV del servidor; Simplemente escribiríamos:

>>> con ftplib.Ftp ('ftp.de alguna manera.it ',' user ',' contraseña ') como ftp: ... con archivo abierto ('.csv ',' wb ') como descarga_file: ... ftp.RETRBINAR ('REPR FILE.csv ', descarged_file.escribir) ... '226 file transferido con éxito \ n226 0.823 segundos (medido aquí), 6.15 Mbytes por segundo ' 
Copiar

En el ejemplo anterior abrimos un archivo local para escribir en modo binario
(archivo.CSV) Usando un administrador de contexto, luego llamado el retrbinario Método de paso
un apropiado Recarro comando como primer argumento (REPR NAMEOFTHEFILE), y el
escribir Método del objeto de archivo descargado_file Como el segundo argumento, que
es un llamar de vuelta aplicado a cada parte de los datos recibidos.

Hablando de fragmentos de datos, el tamaño máximo de bloque utilizado para la transferencia
de datos, por defecto, es 8192 bytes. Esto, sin embargo, se puede cambiar a través del
Tercer parámetro opcional del retrbinario método.

El retrasos El método funciona un poco de manera diferente, ya que recupera archivos en modo "línea". El primer argumento de este método puede ser válido Recarro comando, al igual que el que usamos en el ejemplo anterior, pero también un LISTA (para recuperar una lista de nombres de archivos e información sobre ellos) o TRABAJO (recuperar solo nombres de archivo). El segundo argumento del método es opcional y es una devolución de llamada que se aplica a cada línea recuperada (el comportamiento predeterminado es imprimir líneas a stdout). Es importante notar que cada línea está despojada del carácter final de la línea, que en Linux está \norte.

Veamos un ejemplo. Si usamos el replante método, podemos recuperar el contenido del archivo.CSV Archivo Línea por línea:

>>> importar sistema operativo >>> con ftplib.Ftp ('host', 'usuario', 'contraseña') como ftp: ... con archivo abierto ('.csv ',' w ') como csvfile: ... ftp.Retlings ('REPR FILE.CSV ', Lambda X: Csfile.escribir("".unirse ([x, OS.líneaseP]))) ... 
Copiar

En el ejemplo anterior importamos el sistema operativo Módulo, entonces, al igual que antes, creamos un archivo localmente, esta vez en modo textual. Con el ftp.retrasos método recuperamos el archivo.CSV Archivo remoto Línea por línea. La devolución de llamada que utilizamos como segundo argumento del retrasos es un lambda función que toma la línea como argumento y llama al escribir método del csvfile ojo para escribir la línea unida con el rayado personaje apropiado para el sistema operativo, al que accedimos por sistema operativo.rayado.

Podemos usar la devolución de llamada para modificar también el contenido del archivo en la mosca. Como ejemplo trivial, imagine que queremos superar cada palabras contenidas en el archivo remoto cuando lo almacenamos localmente. Podríamos escribir:

[...] ... ftp.Retlings ('REPR FILE.CSV ', Lambda X: Csfile.escribir("".Únete ([x.superior (), OS.líneaseP]))) 
Copiar

Este método, como ya mencionamos, se puede usar para trabajar también con las líneas devueltas por el LISTA o TRABAJO comandos. Supongamos que queremos guardar el resultado de enumerar un directorio en el servidor remoto en un archivo local:

>>> con ftplib.Ftp ('host', 'usuario', 'contraseña') como ftp: ... con Open ('List_Result', 'W') como LocalFile: ... ftp.Retlings ('List', Lambda X: Localfile.escribir("".unirse ([x, OS.líneaseP]))) 
Copiar

El archivo local list_result será creado (o truncado y sobrescribido si ya existe), y su contenido será algo similar a:

DRWXR-XR-X 2 FTP FTP 4096 Oct 13 14:37 . DRWXR-XR-X 2 FTP FTP 4096 Oct 13 14: 37… -RW ------- 1 ftp ftp 10 sep 10 06:04 .ftpquota -rw-r-r-- 1 ftp ftp 5306756 18 de octubre 01:32 archivo.CSV 

Cargar archivos al servidor

Cuando necesitamos cargar un archivo en un servidor FTP, también podemos elegir hacerlo en modo binario o de "líneas". Los dos métodos que podemos usar para realizar la tarea son respectivamente: almacenamiento y listón.

El almacenamiento método del Ftp La clase toma dos argumentos obligatorios que son válidos Agenda comando, y el objeto de archivo creado a partir de un archivo local abierto en modo binario. Supongamos que queremos cargar un archivo; Escribiríamos:

>>> con ftplib.Ftp ('host', 'usuario', 'contraseña') como ftp: ... con Open ('LinuxConfig.txt ',' rb ') como file_object: ... ftp.Storbinary ('stor Linuxconfig.txt ', file_object) 
Copiar

Realmente simple! Por supuesto, también podemos almacenar el archivo en el servidor con un nombre diferente. El objeto de archivo se aprobó como el segundo argumento del estorbinario El método se lee hasta EOF. Al igual que en el caso del retrbinario Método, es posible cambiar el tamaño de la fragmentación de datos, con el tercer argumento opcional (el valor predeterminado, es, nuevamente 8192 bytes). El cuarto argumento aceptado por el estorbinario método, es un opcional llamar de vuelta función que se aplica a cada fragmento de datos.

Para cargar un archivo de línea por línea, podemos usar el prostituta método en su lugar. En este caso, el archivo que queremos cargar se leerá por línea. Los primeros dos argumentos son los mismos aceptados por el estorbinario método, mientras que el tercero (y el último) es un llamar de vuelta que se aplica a cada línea.

Navegar, crear directorios, eliminar y renombrar archivos

El Ftp clase (y el Ftp_tls clase que lo extiende) proporciona también algunos métodos muy útiles para realizar algunas de las operaciones más comunes. Por ejemplo, para crear un directorio en el servidor FTP remoto, podemos usar el MKD Método que toma el nombre de ruta del directorio para crear como su único argumento:

>>> ftp.Mkd ('NewDir') 'Newdir' 
Copiar

Para cambiar el directorio de trabajo podemos usar el CWD Método, pasando el nombre del directorio al que queremos avanzar como argumento:

>>> ftp.CWD ('NewDir') '250 OK. El directorio actual es /newdir ' 
Copiar

Para eliminar un directorio existente, podemos usar el RMD método, pasando el nombre del directorio a eliminar:

>>> ftp.RMD ('NewDir') '250 El directorio se eliminó con éxito' 
Copiar

Para eliminar un archivo regular podemos usar el borrar Método en su lugar, pasar el nombre del archivo para eliminar como argumento:

>>> ftp.borrar archivo.CSV ')' 250 Archivo eliminado.CSV ' 
Copiar

Para cambiar el nombre de archivos o directorios, podemos usar el rebautizar método. Acepta dos argumentos: el primero es el nombre actual del archivo o directorio, el segundo es el nuevo. Para cambiar el nombre archivo.CSV a Archivo0.CSV, Por ejemplo, escribiríamos:

>>> ftp.renombrar archivo.csv ',' file0.CSV ')' 250 Archivo renombrado o movido correctamente ' 
Copiar

Cerrar una conexión manualmente

Como ya aprendimos, el Ftp La clase se puede usar con un administrador de contexto, de modo que la conexión se cierre automáticamente cuando el intérprete sale del con bloque de declaraciones. Sin embargo, en los casos en que tenemos que cerrar la conexión manualmente, debemos usar el abandonar Método: llama al cerca método internamente y envía un ABANDONAR comandar al servidor que intente cerrar la conexión con gracia.

Conclusiones

En este artículo aprendimos a usar la pitón ftplib módulo para conectarse a un servidor FTP e interactuar con él. Vimos cómo crear una instancia del Ftp clase y cuáles son los métodos que podemos usar para enumerar el contenido de un directorio remoto y cargar/descargar archivos. También vimos cómo crear, eliminar, cambiar el nombre y eliminar directorios o archivos y cómo cambiar el directorio de trabajo. En este tutorial exploramos los casos de uso más comunes, para una lista completa de funciones, visite la página oficial de libtp.

Tutoriales de Linux relacionados:

  • Tutorial LFTP sobre Linux con ejemplos
  • Lista e instalación de clientes FTP en Ubuntu 20.04 Linux ..
  • Lista e instalación de clientes FTP en Ubuntu 22.04 Linux ..
  • Cómo configurar un servidor OpenVPN en Ubuntu 20.04
  • Ubuntu 20.04: Lista de clientes de torrents
  • Ubuntu 22.04: Lista de clientes de torrents
  • Configurar servidor FTP en Linux
  • Cosas para instalar en Ubuntu 20.04
  • Cómo configurar VSFTPD en Debian
  • Cómo configurar el servidor FTP/SFTP y el cliente en Almalinux