Cómo conectarse a un servidor FTP usando Python
- 4099
- 634
- Alejandro Duran
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
Requisitos y convenciones de software utilizados
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 elescribir
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
- « Ubuntu 20.10 Descargar
- Cómo arreglar el mensaje de error Firefox ya se está ejecutando pero no responde »