Como se conectar a um servidor FTP usando o Python
- 3594
- 225
- Maurice Champlin
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
Requisitos de software e convenções usadas
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 aescrever
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
- « Ubuntu 20.10 Download
- Como corrigir a mensagem de erro Firefox já está em execução, mas não está respondendo »