Como enviar e receber arquivos via FTP

O FTP (File Transfer Protocol) é uma maneira popular e rápida de enviar e baixar arquivos entre computadores. Um cliente realiza uma conexão TCP para a porta 21 do servidor. Essa conexão, chamada de conexão de controle, permanece aberta ao longo da sessão enquanto uma segunda conexão, chamada conexão de dados, é estabelecida na porta 20 do servidor e em alguma porta do cliente (estabelecida no diálogo entre ambos) como requisitado para a transferência de arquivo.

O servidor responde na conexão de controle com três dígitos de código de estado em ASCII com uma mensagem de texto opcional. Por exemplo, “200” ou “200 OK” significa que o último comando obteve sucesso. Os números representam o número do código e o texto opcional representa as explicações ou parâmetros necessários.

FTP pode ser executado em modo ativo ou passivo, os quais determinam como a conexão de dados é estabelecida. No modo ativo, o cliente envia para o servidor o endereço IP e o número da porta na qual ele irá ouvir e então o servidor inicia a conexão TCP (se o firewall do cliente não permitir a conexão trava). Em situações onde o cliente está atrás de um firewall e inapto para aceitar entradas de conexões TCP, o modo passivo pode ser utilizado (o servidor tem uma faixa de portas abertas para permitir a conexão, e a conexão é feita somente pela porta de entrada do servidor). O cliente envia um comando PASV para o servidor e recebe um endereço IP e um número de porta como resposta, os quais o cliente utiliza para abrir a conexão de dados com o servidor.

Modo gráfico

É possível baixar e enviar arquivos via FTP através do próprio navegador de internet. Para isso, digite na barra de endereço o seu endereço de ftp (ftp://[username]:[password]@[servidor]:[porta] ou, por exemplo, ftp://ftp.seusite.com.br). Será necessário digitar o usuário e a senha de acesso ao seu servidor para efetuar o logon. Na tela aparecerão as pastas e arquivos do site (geralmente, estão dentro da pasta “public_html”). Selecione os arquivos que você deseja copiar para dentro do servidor e dê um Ctrl + C para copiar, vá na página do ftp e dentro da pasta dê um Ctrl + V para colar.

Caso a quantidade de arquivos seja muito grande (ou o tamanho dos arquivos seja considerável), é bom utilizar um programa próprio para transferência de arquivos, que permita o monitoramento de cada download/upload e também o reinício de onde parou, além de indicar quais arquivos não tenham sido enviados e seja possível o reenvio. Um bom programa gráfico para transferência de dados via FTP, utilizando SSL/TLS (conexão segura) ou não, e STFP (SSH File Transfer Protocol) e de código livre é o FileZilla. Pode ser instalado a partir do repositório com o comando “apt-get install filezilla” (Linux) ou baixando o programa a partir do site do projeto (Windows): https://filezilla-project.org/download.php?show_all=1

Tela do programa de transferência FTP FileZilla.
Tela do programa de transferência FTP FileZilla.

O Filezilla é bem intuitivo e fácil de usar. Ao entrar no programa, você verá a tela abaixo. Utilize a barra de conexão rápida para digitar o host (site a ser conectado), usuário e senha (se não houver uma porta específica, deixe em branco) e clique no botão “conexão rápida”. Ao lado desse botão tem uma seta para baixo onde fica guardado um histórico de endereços de FTP acessados, evitando que o usuário precise decorar um a um.

Para enviar arquivos para o computador remoto (upload), escolha a pasta e os arquivos no computador local (janela da esquerda) e arraste para o diretório desejado no computador remoto (janela da direita). Para download de dados é o mesmo procedimento só que ao contrário. Pode também clicar com o botão direito em cima do(s) arquivo(s) a ser(em) transferido(s) e clicar em upload/download. Também é possível excluir e editar arquivos remotamente (ao final da edição, aparece uma janela para envio da nova versão e substituição do arquivo). Para reenviar um (ou mais) arquivo(s) em que houve falha na transmissão, clique nele(s) com o botão direito e escolha a opção reenviar.

Modo texto

Veja esse guia rápido para envio e recebimento de arquivos no FTP usando modo texto:

– Baixar todos os arquivos de um diretório no servidor FTP (download)

wget -r ftp://$user:$pass@$host/Diretorio

– Subir todos os arquivos de um diretório para o servidor FTP (upload)

find Diretorio -type f -exec curl -u $user:$pass --ftp-create-dirs -T {} ftp://$host/{} \;

Caso o nome do usuário ou a senha tenham caracteres especiais, basta usar a notação hexadecimal para os caracteres (%40 em vez de @, por exemplo).

Para acessar via linha de comando, digite ftp endereço_ftp e dê ENTER. Veja a figura a seguir com um exemplo de logon, listagem de diretórios (comando “ls”), mudança de diretório (“cd”), encerramento de sessão (“close”) e saída do ftp (“exit”):

Tela com exemplo de uso do ftp em terminal Linux.
Tela com exemplo de uso do ftp em terminal Linux.

Como observado, os comandos são bem parecidos com os do do terminal “comum”, com algumas importantes exceções. Para fazer o download de um arquivo, utiliza-se o comando get (para vários, usar o comando “mget *.iso”, por exemplo, que baixa todos os arquivos com extensão “.iso”). Para enviar arquivos, usar o comando “put” (e “mput” envia vários arquivos). Para utilizar o modo passivo, escreva “passive” antes do comando de envio.

Veja os passos para enviar um conjunto de arquivos em um computador para um servidor FTP remoto (upload via FTP):

  1. No terminal bash, digitar o comando “ftp”;
  2. Já no terminal FTP, digitar “open” para abrir uma conexão;
  3. Ao aparecer (to), colocar o endereço (ftp.site.com.br, por exemplo);
  4. Quando completar a conexão, digite o nome de usuário e depois a senha;
  5. Digite “passive” para ativar o modo passivo (se for o caso);
  6. Vá para a pasta onde serão copiados os arquivos (cd /home/user/backup, por exemplo);
  7. Para não pedir confirmação para cada arquivo, digite “prompt” e dê enter;
  8. Finalmente, digite o comando para enviar múltiplos arquivos (mput , por exemplo);
  9. Digite “close” para fechar a conexão e “exit” para sair do terminal FTP.

Veja um exemplo de shell script em que host, usuário e senha são definidos em variáveis e o acesso ftp é realizado para remover um diretório com arquivos dentro:

ftp -n $host << END_SCRIPT
quote USER $user
quote PASS $pass
prompt
mdelete /dir/*
rmdir /dir
quit
END_SCRIPT

O parâmetro “-n” restringe tentativa de auto-login; “quote” força o ftp a receber textualmente os argumentos; “prompt” desativa a interação com o usuário. Como o comando “rmdir” apaga somente diretórios vazios, deve-se excluir todos os arquivos desse diretório antes, através do comando “mdelete”. Se mesmo assim não conseguir apagar o diretório (“550 Remove directory operation failed”), provavelmente ele está corrompido; renomeie o diretório e tente novamente apagá-lo.

SFTP e VSFTPD

O comando interativo sftp é semelhante ao ftp, mas que usa protocolo SSH. Em uma única sessão, o sftp pode transferir vários arquivos, e com ele é possível manipular arquivos remotos (apagar, renomear, alterar permissões, etc.).

VSFTPD (Very Secure FTP Daemon) é um servidor FTP para Linux. Sua instalação e configuração podem ser vistas no link – o arquivo de log está em “/var/log/vsftpd.log”.

Para adicionar um usuário com acesso a um diretório especifico e diferente dos outros usuários:

  • Crie um usuário usando “adduser fulano”
  • Inclua no arquivo de configurações (/etc/vsftpd.conf) as seguintes linhas:
chroot_local_user=YES
user_config_dir=/etc/vsftpd_users
chroot_list_enable=NO
  • Crie o diretório “/etc/vsftpd_users”, caso já não exista, e um arquivo com o nome do usuário dentro desse diretório
  • Coloque as seguintes linhas dentro do arquivo “/etc/vsftpd_users/fulano”:
write_enable=YES
local_root=/home/fulano
dirlist_enable=YES
download_enable=YES
local_umask=022
passwd_chroot_enable=yes
  • Altere o arquivo “/etc/passwd” a linha contendo “/home/fulano” para “/home/./fulano” – dessa forma, o vsftp estará “chrooting” (restringindo o acesso) ao diretório da home

Agora, é possível realizar o acesso FTP fulano@numero_do_ip e o diretório que será aberto é a home do usuário fulano, com direito a leitura e gravação.

LFTP

Cópias recursivas, ou seja, de um diretório com toda sua estrutura de pastas e arquivos, podem ser realizados através do comando lftp. Para realizar um download (get) recursivo de um servidor FTP para um computador local, deve-se ir para o diretório que receberá os arquivos e executar o seguinte comando:

lftp -u user,password ftpserver.com.br -e 'mirror -c /remote_path; bye'

A opção “-e” permite executar os comandos listados dentro de aspas simples e separados por ponto e vírgula, da mesma forma que seriam executados linha por linha no terminal lftp – no caso, “bye” serve para encerrar a conexão FTP e liberar o terminal bash ao final da execução. O comando “mirror” realiza a cópia recursiva. A opção “-R” significa “reverse mirror”, ou seja, é utilizada para realizar o upload (put) de arquivos da máquina local para o FTP, conforme exemplo:

lftp -u user,password ftpserver.com.br -e 'mirror -Rc /local_path/ /remote_path; bye'

É recomendável utilizar a opção “-c” ao iniciar um trabalho, pois ele permite continuar a cópia de onde parou – caso queira copiar apenas os arquivos que não constam do diretório de destino, inclua o parâmetro “–only-newer” em vez do “-c”. Para limitar a velocidade de download e upload, utilize “set net:limit-total-rate 1048576:0” – nesse caso, a velocidade de download está limitada a 1 MB/s e sem limite para velocidade de upload. Para forçar a utilização do modo passivo (que é o default), utilize “set ftp:passive-mode on”.

Para remover um diretório com tudo o que tiver dentro (subdiretórios e/ou arquivos):

lftp -u $user,$pass $host -e 'glob -a rm -r /dir; bye'

A opção “glob” permite o uso de wildcards como o asterisco, enquanto que o parâmetros “-a” manda considerar tanto diretórios (-d) quanto arquivos (-f). Se quiser excluir somente o conteúdo, mantendo a pasta vazia, utilize * depois do nome do diretório.

Já no terminal lftp, veja como ficam os comandos para copiar todos os arquivos de uma determinada pasta local para uma certa pasta no servidor FTP (linha 1) e vice-versa (linha 2):

lftp user@host:~&> mput -E /local_path/* -O /remote_path
lftp user@host:~&> mget -E /remote_path/* -O /local_path

O argumento “-E” (opcional) exclui os arquivos depois de serem corretamente copiados. Mais opções e comandos podem ser vistos no manual do lftp.

Montar diretório remoto por FTP

Em vez de usar os comandos ftp/lftp/sftp, é possível usar o aplicativo CurlFtpFS para montar o diretório do servidor FTP na máquina local em que está trabalhando. Desse modo, é possível acessar os arquivos como se estivessem em um diretório local, com toda a gama de ferramentas disponíveis em um terminal Linux. Para isso, primeiro deve-se instalar o comando através de “sudo apt-get install curlftpfs”.

Seu uso é muito semelhante a montar/desmontar um dispositivo. Primeiro, crie uma pasta para ser o ponto de montagem:

$ sudo mkdir -p /media/ftp_remoto

Para montar e desmontar o diretório do servidor, use os seguintes comandos:

$ curlftpfs DOMINIO_OU_IP /media/ftp_remoto -o user=USUARIO:SENHA,allow_other
$ sudo fusermount -u /media/ftp_remoto

Caso queira que o diretório seja montado automaticamente toda vez que iniciar o sistema operacional, incluir a seguinte linha no arquivo /etc/fstab como root:

curlftpfs#USUARIO:SENHA@DOMINIO_OU_IP /mnt/mydomainorg fuse auto,user,uid=1000,allow_other,_netdev 0 0

3 comments

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.