====== File Transfer Protocol ======
O serviço de transferência de arquivos via FTP (//File Transfer Protocol//) é um dos serviços mais usados na Internet. Ele pode ser usado para transferência de arquivos privados de usuários, usando autenticação via ''nome/senha'', e também para acesso a repositórios públicos, com acesso anônimo.
===== Servidores e clientes =====
Vários servidores de FTP estão disponíveis gratuitamente em ambiente UNIX, entre eles são muito usados o [[http://vsftpd.beasts.org|VSFTP]], o [[http://www.wfms.org/wu-ftpd|WU-FTP]], o [[http://www.proftpd.org|ProFTPd]] e o [[http://www.pureftpd.org|PureFTP]]. Cada um deles possui seus próprios arquivos de configuração. A Wikipedia traz uma excelente relação de [[http://en.wikipedia.org/wiki/List_of_FTP_server_software|servidores FTP]] para várias plataformas.
Servidores de FTP podem ser acessados através de clientes em linha de comando, clientes gráficos específicos ou navegadores Web. A maioria dos sistemas operacionais dispõe de um cliente FTP em modo texto, acessível através do comando ''ftp'', a ser digitado em um terminal.
Para acesso usando um navegador Web, a URL do serviço FTP tem a forma "''%%ftp://user:password@host:port/path%%''" (a parte "''user:password@''" pode ser omitida no caso de conexões anônimas). O [[ftp://ftp.pucpr.br|servidor FTP da PUCPR]] mostra um exemplo de acesso ao serviço FTP através de navegador.
===== O serviço FTP =====
O serviço de FTP é provido por um //daemon// geralmente chamado ''ftpd'', que pode ser lançado através do //daemon// ''inetd/xinetd'' ou então como um serviço autônomo. Ele faz uso das portas 20/TCP (fluxo de dados) e 21/TCP (controle da conexão), mas também pode usar outras portas acima de 1024. Os logs de uso do servidor FTP são normalmente armazenados em ''/var/log/xferlog''.
Em relação à autenticação, o servidor de FTP pode oferecer dois tipos de acesso:
* acesso **autenticado**: ao se conectar, o usuário fornece seu //login// e sua senha; caso seja autenticado corretamente, o servidor FTP abre um terminal simplificado para transferência de arquivos, com acesso ao diretório ''$HOME'' daquele usuário;
* acesso **anônimo**: ao se conectar, o usuário se identifica como ''anonymous'' ou ''guest'', sem senha (ou usando um e-mail como senha). Caso a configuração do servidor permita acessos anônimos, o servidor abre um terminal para transferência de arquivos em uma área pública (por exemplo, ''/var/ftp/pub''). Normalmente, as trasferências anônimas são limitadas ao //download// de arquivos, não sendo permitido o //upload//.
Um exemplo de FTP autenticado:
(client)$ ftp espec.ppgia.pucpr.br
Connected to espec.ppgia.pucpr.br.
220 (vsFTPd 1.0.0)
Name (espec:maziero): maziero
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 500 500 4096 Jul 31 15:20 Desktop
drwxr-xr-x 2 500 500 4096 Jul 31 18:58 bin
-rw-r--r-- 1 500 500 435 Jul 31 22:22 journal.txt
drwx------ 2 500 500 4096 Jul 18 12:50 projs
drwx-----x 4 500 500 4096 Jul 31 19:03 public_html
226 Directory send OK.
ftp> quit
Um exemplo de FTP anônimo:
(client)$ ftp ftp.unicamp.br
Connected to zeus.unicamp.br.
220 FTPserver da Unicamp - Master - Default
Name (ftp.unicamp.br:maziero): anonymous
331 Anonymous login ok, send your complete email address as your password
Password:
230-
Bem-vindo ao servidor FTP da Unicamp!
Sugestoes e comentarios, por favor entre em contato com .
Welcome to UNICAMP's FTP server!
For comments on this site, please contact .
You are user (162) of (300) simultaneous users allowed.
230 Anonymous access granted, restrictions apply
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
150 Opening ASCII mode data connection for file list
-rw-r--r-- 1 FtpUser FtpGroup 302 Jul 11 2005 msg.welcome
drwxrwsr-x 10 FtpUser FtpGroup 1024 Jul 15 16:48 pub
drwxrwsr-x 10 FtpUser FtpGroup 512 Apr 26 2007 pub2
drwxrwsr-x 11 FtpUser FtpGroup 512 Feb 22 13:08 pub3
drwxrwsr-x 3 FtpUser FtpGroup 512 Jul 16 11:16 pub4
drwxrwsr-x 4 FtpUser FtpGroup 512 Jul 15 12:16 pub5
drwxrwsr-x 13 FtpUser FtpGroup 512 Jul 15 12:51 pub6
226 Transfer complete
ftp> quit
Quanto ao formato dos dados transferidos, a transferência pode ocorrer de dois modos:
* **ASCII**: neste modo de operação, os caracteres enviados pelo servidor podem ser "traduzidos" pelo cliente, quando o conjunto de caracteres das duas plataformas for diferente. Por exemplo, se o conjunto de caracteres da plataforma do servidor for Unicode (UTF-8) e o conjunto do cliente for ISO-8859-1 (ISO-Latin1), alguns caracteres poderão ser convertidos durante a transferência. Esse modo de operação é o default.
* **Binário**: neste modo de operação, os caracteres enviados pelo servidor são recebidos pelo cliente //as-is//, ou seja, sem conversões. Com isso, eventuais conteúdos binários podem ser transferidos sem modificação. Esse modo de operação é fundamental para a transferência de arquivos binários, como imagens, vídeos, arquivos compactados e executáveis.
Os modos de operação binário ou ASCII podem ser selecionados na linha de comando do cliente FTP, através dos comandos ''bin'' e ''ascii'', respectivamente.
===== Comandos FTP =====
Um cliente FTP em linha de comando oferece um conjunto de comandos para operações envolvendo arquivos, como //download//, //upload//, navegação em diretórios, etc. Os comandos básicos oferecidos pela maioria dos clientes FTP são apresentados a seguir:
^ Comando e exemplo ^ Significado ^
| ''ftp %%ftp.pucpr.br%%'' | lança o cliente e abre uma conexão com o servidor indicado |
| ''open %%ftp.pucpr.br%%'' | inicia uma conexão com o servidor indicado |
| ''bye''\\ ''quit'' | encerra a conexão e o cliente FTP |
| ''close'' | encerra a conexão (mas não o cliente) |
| ''ls''\\ ''dir'' | lista o conteúdo do diretório remoto |
| ''cd dirA'' | muda o diretório remoto para ''dirA'' |
| ''cd ..'' | retorna ao diretório anterior |
| ''lcd dirB'' | muda o diretório local (do cliente) para ''dirB'' |
| ''pwd'' | informa o diretório remoto atual |
| ''get arquivo.txt'' | obtém o arquivo remoto ''arquivo.txt'' |
| ''get arquivo.txt file.txt'' | obtém o arquivo remoto ''arquivo.txt'', salvando-o localmente como ''file.txt'' |
| ''mget *.c'' | obtém todos os arquivos remotos ''*.c'' |
| ''put arquivo.txt'' | transfere o arquivo local ''arquivo.txt'' para o servidor |
| ''mput *.jpg'' | transfere para o servidor todos os arquivos locais ''*.jpg'' |
| ''delete arq.txt'' | remove o arquivo remoto ''arq.txt'' |
| ''mkdir dirA'' | cria um novo diretório |
| ''rmdir dirB'' | remove o diretório indicado (se estiver vazio) |
| ''ascii'' | ajusta modo de transferência para ASCII |
| ''bin'' | ajusta modo de transferência para binário |
| ''prompt'' | liga/desliga as confirmações individuais para ''mget'' e ''mput'' |
| ''passive'' | liga/desliga o modo passivo (vide abaixo) |
| ''help'' | mostra os comandos disponíveis |
===== Modos ativo e passivo =====
O serviço FTP sempre inicia através de uma conexão à porta 21/TCP do servidor; essa conexão e responsável pelo controle das transferências de dados entre cliente e servidor, sendo por isso chamada de //control port//. A seguir, é necessário abrir uma segunda conexão entre ambos, sobre a qual ocorrerão as transferências de dados propriamente ditas; por isso, essa nova conexão é chamada //data port//.
Há duas formas de se estabelecer a conexão de dados. Na primeira forma, chamada **FTP Ativo**, o cliente cria uma porta TCP de número N>1023, e o servidor conecta a essa porta do cliente, a partir de sua porta 20/TCP. Essa forma de operação pode trazer problemas em algumas redes, pois o servidor precisa se conectar em uma porta do cliente, o que normalmente é bloqueado pelos //firewalls// do lado do cliente.
O quadro a seguir detalha a operação em **modo ativo**:
^ Passo ^ Cliente ^ Servidor ^
| 1 | Pede conexão à porta 21/TCP do servidor | |
| 2 | | Aceita o pedido de conexão |
| 3 | Solicita autenticação de usuário | |
| 4 | | Autentica o usuário |
| 5 | Escolhe uma porta N>1023 e informa ao servidor | |
| 6 | | Recebe o número de porta N escolhido pelo cliente |
| 7 | Seleciona um conteúdo para //download// | |
| 8 | | Pede conexão à porta N/TCP do cliente,\\ a partir de sua porta 20/TCP |
| 9 | Aceita o pedido de conexão | |
| 10 | | Envia o conteúdo solicitado para a porta N/TCP |
| 11 | Recebe o conteúdo solicitado | |
Uma transferência em FTP ativo entre o cliente ''192.168.0.174'' e o servidor FTP ''200.192.112.10'' é mostrada da seguinte forma pelo comando ''netstat'' (aqui N vale 54398):
Proto Recv-Q Send-Q Endereço Local Endereço Remoto Estado
tcp 0 0 192.168.0.174:54398 200.192.112.10:20 ESTABELECIDA
tcp 0 0 192.168.0.174:38631 200.192.112.10:21 ESTABELECIDA
Na segunda forma, denominada **FTP Passivo**, o servidor cria uma porta TCP de número aleatório N>1023 e informa ao cliente, que se conecta a essa porta do servidor. Dessa forma, todas as conexões sempre partem do cliente, o que permite atravessar a maioria dos //firewalls// do lado do cliente. Todavia, o servidor passa a operar com portas aleatórias, o que complica a configuração de //firewalls// do lado do servidor.
O quadro a seguir detalha a operação em **modo passivo**:
^ Passo ^ Cliente ^ Servidor ^
| 1 | Pede conexão à porta 21/TCP do servidor | |
| 2 | | Aceita o pedido de conexão |
| 3 | Solicita autenticação de usuário | |
| 4 | | Autentica o usuário |
| 5 | Seleciona o modo passivo | |
| 6 | | Escolhe uma porta N>1023 e informa ao cliente |
| 7 | Recebe o número de porta N escolhido pelo servidor | |
| 8 | Seleciona um conteúdo para //download// | |
| 9 | Pede conexão à porta N/TCP informada pelo servidor | |
| 10 | | Aceita o pedido de conexão |
| 11 | Solicita o conteúdo desejado à porta 21/TCP | |
| 12 | | Envia o conteúdo solicitado usando a porta N/TCP |
Uma transferência em FTP passivo entre o cliente ''192.168.0.174'' e o servidor FTP ''200.192.112.10'' é mostrada da seguinte forma pelo comando ''netstat'' (aqui, N vale 44072):
Proto Recv-Q Send-Q Endereço Local Endereço Remoto Estado
tcp 0 0 192.168.0.174:38632 200.192.112.10:21 ESTABELECIDA
tcp 0 0 192.168.0.174:34197 200.192.112.10:44072 ESTABELECIDA
Resumindo, em modo ativo:
* Fluxo de controle: client:M => server:21
* Fluxo de dados: client:N <= server:20
E em modo passivo:
* Fluxo de controle: client:M => server:21
* Fluxo de dados: client:P => server:N