Como se conectar a um servidor FTP usando o Python

Como se conectar a um servidor FTP usando o Python

FTP (Protocolo de transferência de arquivos) não precisa de apresentações: está entre os métodos de transferência de arquivos mais usados ​​entre um ou mais clientes e um servidor. Por design, ele suporta acesso e autenticação anônimos, mas em sua forma mais básica não fornece criptografia de dados, é por isso que é frequentemente protegida via TLS.

Muitos aplicativos do cliente FTP estão disponíveis no Linux, como por exemplo Filezilla (gráfico) ou LFTP (linha de comando). Às vezes, no entanto, podemos querer acessar um servidor FTP programaticamente, talvez para agendar transferências de arquivos. Uma maneira fácil de fazer isso é usar uma linguagem de programação como o Python. Neste tutorial, aprenderemos a usar o ftplib Biblioteca para interagir com um servidor FTP.

Neste tutorial, você aprenderá:

  • Como criar uma instância do ftplib.Classe FTP
  • Como listar arquivos em um servidor FTP remoto
  • Como fazer upload de arquivos no modo binário e "linhas"
  • Como baixar arquivos no modo binário e "linhas"
  • Como criar, excluir e renomear diretórios e arquivos
  • Como mudar o diretório de trabalho
Como se conectar a um servidor FTP usando o Python

Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Distribuição Independente
Programas Pitão
Outro Nenhuma outra permissões necessárias
Convenções # - requer que os comandos linux -comidos sejam executados com privilégios de raiz diretamente como usuário root ou por uso de sudo comando
$-exige que o Linux-Commands seja executado como um usuário não privilegiado regular

A biblioteca FTPLIB

O ftplib O módulo faz parte da biblioteca padrão do Python e fornece duas classes principais para abstrair o trabalho com uma conexão FTP: ftblib.Ftp e ftplib.Ftp_tls. O último é uma subclasse do primeiro e adiciona suporte para TLS. Vamos ver alguns dos casos de uso mais comuns da biblioteca.

Conectando -se a um servidor FTP

Para se conectar a um servidor FTP, a primeira coisa que temos que fazer é criar uma instância do Ftp aula. A classe suporta o com Declaração para que possa ser usada com um gerente de contexto: dessa maneira, a conexão será fechada automaticamente quando terminarmos de trabalhar ou ocorrer um erro. Aqui está um exemplo de uso:

com ftplib.Ftp ('ftp.de alguma forma.com ') como FTP: # Codehera 
cópia de

Todos os parâmetros do Ftp O construtor de classe é opcional, no entanto, aqui fornecemos o primeiro argumento aceito por ele, que é o hospedar Queremos conectar -se a. Se o argumento for fornecido, o conectar O método, usado para estabelecer uma conexão com o servidor, é implicitamente chamado com o host especificado passado como argumento, caso contrário, deve ser chamado explicitamente:

com ftplib.Ftp () como ftp: ftp.Connect ('FTP.de alguma forma.com ') 
cópia de

O segundo argumento aceito pelo Ftp construtor de classe é o do utilizador Queremos fazer login como no servidor FTP. Fornecendo este argumento causará o Conecte-se método a ser chamado implicitamente com o do utilizador, o senha e Acct Os valores foram aprovados como argumentos (eles são os terceiros e quartos parâmetros do construtor de classe e padrão para uma string vazia como valor):

com ftplib.Ftp ('ftp.de alguma forma.It ',' testUser ',' testpassword ') como ftp: # codehere 
cópia de

Se o argumento não for fornecido, o Conecte-se O método deve ser chamado explicitamente:

com ftplib.Ftp ('ftp.de alguma forma.É ') como FTP: FTP.login ('testuser', 'senha') 
cópia de

Obtendo uma lista de arquivos no servidor

Uma vez um Ftp O objeto é criado, basicamente temos três maneiras de obter uma lista dos arquivos armazenados no servidor FTP aos quais estamos conectados. Primeiro de tudo, podemos usar o dir método, que produz uma listagem de diretórios conforme retornado pelo LISTA comando:

>>> com ftplib.Ftp ('ftp.de alguma forma.É ',' usuário ',' senha ') como ftp: ... ftp.dir () 
cópia de

O dir O método aceita um argumento opcional, que é o diretório para listar (o padrão é o diretório de trabalho atual, portanto, neste caso, a raiz FTP). O código acima produz uma saída semelhante ao seguinte:

drwxr-xr-x 2 ftp ftp 4096 13 de outubro 14:37 . drwxr-xr-x 2 ftp ftp 4096 13 de outubro 14: 37… -rw ------- 1 ftp ftp 10 set 10 06:04 .ftpquota -rw-r-r-- 1 ftp ftp 5306756 18 de outubro 01:32 Arquivo.CSV 

O segundo método que podemos usar para obter uma lista de arquivos é nlst. Como o próprio nome sugere, esse método, sob o capô, envia um Nlst comando para o servidor; Ele retorna uma lista Python contendo o nome dos arquivos como membros:

>>> com ftplib.Ftp ('ftp.de alguma forma.É ',' usuário ',' senha ') como ftp: ... ftp.nlst () ... ['.',' ... ','.ftpquota ',' arquivo.CSV '] 
cópia de

O terceiro método que podemos usar para obter para listar o conteúdo de um diretório é MLSD. Este método usa o MLSD Comando (para que funcione, o servidor deve apoiá -lo) e aceita dois argumentos opcionais:

  • O caminho do diretório que deve ser listado
  • Uma lista das informações que queremos ser incluídas no resultado

O método retorna um gerador que produz a Tupla de dois elementos Para cada arquivo: o primeiro elemento de cada tupla é o nome do arquivo; o segundo a dicionário contendo as informações solicitadas e seus valores. Vamos ver um exemplo:

>>> com ftplib.Ftp ('ftp.de alguma forma.É ',' usuário ',' senha ') como ftp: ... Para o nome do arquivo, informações no FTP.mlsd (): ... Imprimir (nome do arquivo, informação) 
cópia de

A saída do código acima é o seguinte:

. 'type': 'cdir', 'sizd': '4096', 'modify': '20201013123732', 'Unix.modo ':' 0755 ',' Unix.uid ':' 1809 ',' Unix.gid ':' 1811 ',' exclusivo ':' fd04g58e0a67 '… ' type ':' pdir ',' sizd ':' 4096 ',' modify ':' 20201013123732 ', unix'.modo ':' 0755 ',' Unix.uid ':' 1809 ',' Unix.gid ':' 1811 ',' exclusivo ':' fd04g58e0a67 ' .ftpquota 'type': 'arquivo', 'size': '10', 'modify': '20200910040430', 'Unix.modo ':' 0600 ',' Unix.uid ':' 1809 ',' Unix.gid ':' 1811 ',' exclusivo ':' FD04G58E0A9D ' arquivo.csv 'type': 'arquivo', 'size': '5306756', 'modify': '20201017233245', 'Unix.modo ':' 0644 ',' Unix.uid ':' 1809 ',' Unix.gid ':' 1811 ',' exclusivo ':' fd04g58e020a ' 

Observe que o servidor não tem garantia de respeitar a lista de informações que solicitamos.

Recuperando arquivos do servidor

Para recuperar arquivos do servidor, podemos usar o Restinária ou Retines métodos. Vamos ver como eles funcionam.

O Restinária Método recupera um arquivo no modo de transferência binária: é isso que você deseja usar para simplesmente baixar um arquivo do servidor para sua máquina local e não precisa interagir com seu conteúdo. Vamos ver um exemplo de seu uso. Digamos que queremos baixar o arquivo.CSV do servidor; nós simplesmente escrevemos:

>>> com ftplib.Ftp ('ftp.de alguma forma.É ',' usuário ',' senha ') como ftp: ... com open ('arquivo.csv ',' wb ') como baixado_file: ... ftp.Restinária ('RET FILE.csv ', baixado_file.escrever) ... 226-File transferiu com sucesso \ n226 0.823 segundos (medidos aqui), 6.15 mbytes por segundo ' 
cópia de

No exemplo acima, abrimos um arquivo local para escrever em modo binário
(arquivo.CSV) usando um gerente de contexto, então chamado de Restinária passagem de método
um apropriado Ret comando como primeiro argumento (RET Nomeofthefile), e a
escrever Método do objeto de arquivo arquivo baixado como o segundo argumento, que
é um ligar de volta aplicado a cada pedaço de dados recebidos.

Falando em pedaços de dados, o tamanho máximo do bloco usado para a transferência
de dados, por padrão, é 8192 bytes. Isso, no entanto, pode ser alterado através do
terceiro parâmetro opcional do Restinária método.

O TRABALHAR O método funciona um pouco diferente, pois recupera arquivos no modo "Line". O primeiro argumento deste método pode ser um válido Ret comando, assim como o que usamos no exemplo anterior, mas também um LISTA (para recuperar uma lista de nomes de arquivos e informações sobre eles) ou Nlst (recuperar apenas nomes de arquivos). O segundo argumento do método é opcional e é um retorno de chamada que é aplicado a cada linha recuperada (o comportamento padrão é imprimir linhas para stdout). É importante notar que cada linha é despojada do fim do caráter de linha, que no Linux é \ n.

Vamos ver um exemplo. Se usarmos o Retines método, podemos recuperar o conteúdo do arquivo.CSV arquivo de arquivo por linha:

>>> importar os >>> com ftplib.Ftp ('host', 'usuário', 'senha') como ftp: ... com open ('arquivo.csv ',' w ') como csvfile: ... ftp.TRABLINAS ('RET FILE.csv ', lambda x: csfile.escrever("".Junte -se ([X, OS.linesep]))) ... 
cópia de

No exemplo acima, importamos o OS Módulo, então, assim como antes, criamos um arquivo localmente, desta vez no modo textual. Com o ftp.TRABALHAR Método, recuperamos o arquivo.CSV Arquivo remoto linha por linha. O retorno de chamada que usamos como segundo argumento do TRABALHAR é um Lambda função que assume a linha como argumento e chama o escrever Método do CSVFILE objetar para escrever a linha unida ao Linesep personagem apropriado para o sistema operacional, que acessamos por OS.Linesep.

Podemos usar o retorno de chamada para também modificar o conteúdo do arquivo em tempo real. Como um exemplo trivial, imagine que queremos manchas cada palavras contidas no arquivo remoto quando o armazenamos localmente. Poderíamos escrever:

[[...] ... ftp.TRABLINAS ('RET FILE.csv ', lambda x: csfile.escrever("".Junte -se ([x.Upper (), OS.linesep]))) 
cópia de

Este método, como já mencionamos, pode ser usado para também trabalhar com as linhas retornadas pelo LISTA ou Nlst comandos. Suponha que queremos salvar o resultado da listagem de um diretório no servidor remoto em um arquivo local:

>>> com ftplib.Ftp ('host', 'usuário', 'senha') como ftp: ... com open ('list_result', 'W') como LocalFile: ... ftp.TRAFLINAS ('LISTA', LAMBDA X: LOCALFILE.escrever("".Junte -se ([X, OS.linesep]))) 
cópia de

O arquivo local list_result será criado (ou truncado e substituído se já existir), e seu conteúdo será algo semelhante a:

drwxr-xr-x 2 ftp ftp 4096 13 de outubro 14:37 . drwxr-xr-x 2 ftp ftp 4096 13 de outubro 14: 37… -rw ------- 1 ftp ftp 10 set 10 06:04 .ftpquota -rw-r-r-- 1 ftp ftp 5306756 18 de outubro 01:32 Arquivo.CSV 

Carregando arquivos para o servidor

Quando precisamos fazer upload de um arquivo para um servidor FTP, também podemos optar por fazê -lo no modo binário ou "linhas". Os dois métodos que podemos usar para realizar a tarefa são respectivamente: Storebinary e Storelines.

O Storebinary Método do Ftp A classe leva dois argumentos obrigatórios que são válidos Stor comando e o objeto de arquivo criado a partir de um arquivo local aberto no modo binário. Suponha que queremos fazer upload de um arquivo; nós escrevíamos:

>>> com ftplib.Ftp ('host', 'usuário', 'senha') como ftp: ... com open ('LinuxConfig.txt ',' rb ') como file_object: ... ftp.Storbinary ('stor linuxconfig.txt ', file_object) 
cópia de

Muito simples! Obviamente, também podemos armazenar o arquivo no servidor com um nome diferente. O objeto de arquivo passou como o segundo argumento do Storbinário o método é lido até o EOF. Assim como no caso do Restinária Método, é possível alterar o tamanho do pedaço de dados, com o terceiro argumento opcional (o padrão, é, novamente 8192 bytes). O quarto argumento aceito pelo Storbinário método, é um opcional ligar de volta função que é aplicada a cada pedaço de dados.

Para fazer upload de uma linha de arquivo por linha, podemos usar o linhas de armazenamento método em vez disso. Nesse caso, o arquivo que desejamos fazer o upload será lido linha por linha. Os dois primeiros argumentos são os mesmos aceitos pelo Storbinário método, enquanto o terceiro (e último) é um ligar de volta que é aplicado a cada linha.

Navegar, criar diretórios, excluir e renomear arquivos

O Ftp classe (e o Ftp_tls classe que a estende) fornece também alguns métodos muito úteis para executar algumas das operações mais comuns. Por exemplo, para criar um diretório no servidor FTP remoto, podemos usar o mkd Método que leva o nome do caminho do diretório para criar como seu único argumento:

>>> ftp.mkd ('newdir') 'newdir' 
cópia de

Para alterar o diretório de trabalho, podemos usar o cwd Método, passando o nome do diretório em que queremos mudar como argumento:

>>> ftp.cwd ('newdir') '250 ok. Diretório atual é /newdir ' 
cópia de

Para excluir um diretório existente, podemos usar o rmd Método, passando o nome do diretório a ser removido:

>>> ftp.rmd ('newdir') '250 O diretório foi removido com sucesso' 
cópia de

Para excluir um arquivo regular, podemos usar o excluir Método, em vez disso, passando o nome do arquivo a ser excluído como argumento:

>>> ftp.excluir ('arquivo.csv ')' 250 Arquivo excluído.csv ' 
cópia de

Para renomear arquivos ou diretórios, podemos usar o Renomear método. Ele aceita dois argumentos: o primeiro é o nome atual do arquivo ou diretório, o segundo é o novo. Para renomear arquivo.CSV para File0.CSV, Por exemplo, nós escrevemos:

>>> ftp.renomear ('arquivo.csv ',' file0.CSV ')' File 250 renomeado ou movido com sucesso ' 
cópia de

Fechando uma conexão manualmente

Como já aprendemos, o Ftp A classe pode ser usada com um gerente de contexto, para que a conexão seja fechada automaticamente quando o intérprete sair do com Bloco de declaração. Nos casos em que temos que fechar a conexão manualmente, no entanto, devemos usar o desistir Método: chama o fechar método internamente e envia um DESISTIR comando para o servidor para tentar fechar a conexão graciosamente.

Conclusões

Neste artigo, aprendemos a usar o Python ftplib módulo para se conectar a um servidor FTP e interagir com ele. Vimos como criar uma instância do Ftp classe e quais são os métodos que podemos usar para listar o conteúdo de um diretório remoto e fazer upload/download de arquivos. Também vimos como criar, excluir, renomear e remover diretórios ou arquivos e como alterar o diretório de trabalho. Neste tutorial, exploramos os casos de uso mais comuns, para uma lista completa de recursos, visite a página oficial da libftp.

Tutoriais do Linux relacionados:

  • Tutorial do LFTP sobre Linux com exemplos
  • Lista de clientes FTP e instalação no Ubuntu 20.04 Linux…
  • Lista de clientes FTP e instalação no Ubuntu 22.04 Linux…
  • Como configurar um servidor OpenVPN no Ubuntu 20.04
  • Ubuntu 20.04: Lista de clientes torrent
  • Ubuntu 22.04: Lista de clientes torrent
  • Configurar servidor FTP no Linux
  • Coisas para instalar no Ubuntu 20.04
  • Como configurar o vsftpd no Debian
  • Como configurar o servidor e o cliente FTP/SFTP no Almalinux