`curl` vs. `wget`: Descubra qual ferramenta Linux é ideal para você!

O comando Linux `curl` oferece uma vasta gama de funcionalidades que vão muito além do simples download de arquivos. Vamos explorar as capacidades do `curl` e entender quando ele se torna a ferramenta ideal em comparação com o `wget`.

`curl` vs. `wget`: Quais são as diferenças?

É comum haver confusão sobre as vantagens de cada comando, `wget` e `curl`. Embora haja uma sobreposição em suas funcionalidades – ambos podem buscar arquivos de servidores remotos – as semelhanças terminam aí.

O `wget` é uma ferramenta poderosa para realizar downloads de conteúdo e arquivos. Ele pode baixar desde arquivos isolados e páginas web até diretórios inteiros. Sua capacidade de percorrer links em páginas web e baixar conteúdo de forma recursiva faz dele um gestor de downloads de linha de comando imbatível.

O `curl`, por sua vez, atende a uma necessidade distinta. Embora também possa obter arquivos, ele não possui a habilidade de navegar recursivamente em um site em busca de conteúdo. Sua verdadeira força está na interação com sistemas remotos, enviando requisições e recebendo respostas. Essas respostas podem ser arquivos, conteúdo de páginas web, ou até mesmo dados de serviços web e APIs.

Além disso, o `curl` não se limita apenas a sites. Ele suporta mais de 20 protocolos, incluindo HTTP, HTTPS, SCP, SFTP e FTP. Sua capacidade de lidar com canais do Linux o torna facilmente integrável com outros comandos e scripts.

O criador do `curl` oferece uma página web onde detalha as diferenças entre `curl` e `wget`, do seu ponto de vista.

Instalação do `curl`

Em alguns sistemas, como Fedora 31 e Manjaro 18.1.0, o `curl` já vem instalado. No entanto, no Ubuntu 18.04 LTS, por exemplo, ele precisa ser instalado manualmente. Use o seguinte comando para instalá-lo no Ubuntu:

sudo apt-get install curl

Verificando a versão do `curl`

O comando `–version` exibe a versão do `curl`, juntamente com todos os protocolos que ele suporta.

curl --version

Obtendo uma página web

Ao direcionar o `curl` para uma página web, ele a recupera.

curl https://www.bbc.com

No entanto, por padrão, o `curl` exibe o código-fonte da página diretamente na janela do terminal.

É importante ter cuidado: se não especificarmos que desejamos salvar o conteúdo em um arquivo, o `curl` sempre o exibirá no terminal. Se o arquivo recuperado for binário, o resultado pode ser imprevisível, com o shell interpretando alguns bytes como caracteres de controle ou sequências de escape.

Salvando dados em um arquivo

Podemos direcionar o `curl` para salvar a saída em um arquivo, usando o operador `>`:

curl https://www.bbc.com > bbc.html

Desta vez, as informações recuperadas não são exibidas no terminal, mas diretamente salvas no arquivo. Como não há saída no terminal, o `curl` mostra informações de progresso.

Isso não ocorreu no exemplo anterior porque as informações de progresso se misturariam com o código-fonte da página web, então o `curl` as suprimiu automaticamente.

Neste caso, o `curl` detecta que a saída está sendo redirecionada para um arquivo e mostra as informações de progresso.

As informações exibidas incluem:

% Total: O tamanho total a ser baixado.
% Recebido: A porcentagem e o tamanho real dos dados já baixados.
% Xferd: A porcentagem e o tamanho real dos dados enviados, em caso de upload.
Average Speed Dload: A velocidade média de download.
Velocidade média de upload: A velocidade média de upload.
Tempo total: O tempo estimado total para a transferência.
Tempo gasto: O tempo já decorrido na transferência.
Tempo restante: O tempo estimado restante para concluir a transferência.
Velocidade atual: A velocidade de transferência atual.

Agora, temos um arquivo chamado “bbc.html”, com o conteúdo da página web.

Ao clicar duas vezes neste arquivo, o navegador padrão o abrirá e exibirá a página web.

Note que o endereço na barra de endereço do navegador aponta para um arquivo local, e não para um site remoto.

Não é preciso usar o redirecionamento para criar um arquivo. Podemos usar a opção `-o` (saída) e especificar o nome do arquivo que desejamos criar.

curl -o bbc.html https://www.bbc.com

Usando uma barra de progresso

Para substituir as informações de download baseadas em texto por uma barra de progresso, use a opção `–#` (barra de progresso).

curl -# -o bbc.html https://www.bbc.com

Retomando um download interrompido

É fácil retomar um download que foi interrompido. Vamos começar baixando um arquivo maior, como a versão mais recente do Ubuntu 18.04. Usaremos a opção `–output` para especificar o nome do arquivo: “ubuntu180403.iso”.

curl --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

O download começa e prossegue até a conclusão.

Se interrompermos o download com `Ctrl + C`, o download será cancelado.

Para retomar o download, usamos a opção `-C` (continuar). Isso faz com que o `curl` reinicie o download no ponto especificado ou no deslocamento dentro do arquivo de destino. Se usarmos um hífen `-` como deslocamento, o `curl` verificará a parte já baixada e determinará o deslocamento correto.

curl -C - --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

O download é retomado e o `curl` exibe o deslocamento em que está reiniciando.

Obtendo cabeçalhos HTTP

Com a opção `-I` (head), podemos obter apenas os cabeçalhos HTTP. Isso equivale a enviar o comando HTTP HEAD para um servidor web.

curl -I www.twitter.com

Este comando recupera apenas os cabeçalhos; ele não baixa nenhuma página web ou arquivo.

Baixando vários URLs

Usando o `xargs`, podemos baixar vários URLs de uma vez. Imagine que queremos baixar várias páginas web que fazem parte de um único artigo ou tutorial.

Copie os URLs para um editor e salve-os em um arquivo chamado “urls-to-download.txt”. Podemos usar o `xargs` para tratar cada linha do arquivo de texto como um parâmetro a ser passado para o `curl`.

https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#0
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#1
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#2
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#3
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#4
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#5

Este é o comando que precisamos para que o `xargs` passe os URLs para o `curl`, um de cada vez:

xargs -n 1 curl -O < urls-to-download.txt

Este comando usa a opção `-O` (arquivo remoto), que faz com que o `curl` salve o arquivo baixado com o mesmo nome que ele possui no servidor remoto.

A opção `-n 1` diz ao `xargs` para tratar cada linha do arquivo de texto como um parâmetro único.

Ao executar o comando, veremos vários downloads começando e terminando, um após o outro.

Ao verificar no navegador de arquivos, vemos que os arquivos foram baixados, cada um com o nome que tinha no servidor remoto.

Baixando arquivos de um servidor FTP

Usar o `curl` com um servidor File Transfer Protocol (FTP) é fácil, mesmo que você precise se autenticar com nome de usuário e senha. Para isso, use a opção `-u` (user) e digite o nome de usuário, dois pontos “:” e a senha. Não deixe espaço antes ou depois dos dois pontos.

Este é um servidor FTP de teste hospedado pela Rebex. Ele possui um nome de usuário “demo” e senha “password”. Não use senhas e nomes de usuário fracos em servidores FTP “reais”.

curl -u demo:password ftp://test.rebex.net

O `curl` detecta que estamos apontando para um servidor FTP e retorna uma lista dos arquivos presentes no servidor.

O único arquivo neste servidor é o “readme.txt”, com 403 bytes. Vamos baixá-lo. Use o mesmo comando, adicionando o nome do arquivo:

curl -u demo:password ftp://test.rebex.net/readme.txt

O arquivo é recuperado e o `curl` exibe seu conteúdo no terminal.

Na maioria dos casos, é mais conveniente salvar o arquivo no disco do que exibi-lo no terminal. Usamos o comando de saída `-O` (arquivo remoto) para que o arquivo seja salvo com o mesmo nome do servidor remoto.

curl -O -u demo:password ftp://test.rebex.net/readme.txt

O arquivo é recuperado e salvo no disco. Podemos usar `ls` para verificar os detalhes do arquivo. Ele tem o mesmo nome e tamanho (403 bytes) do arquivo no servidor FTP.

ls -hl readme.txt

Enviando parâmetros para servidores remotos

Alguns servidores remotos aceitam parâmetros em suas requisições. Os parâmetros podem formatar os dados retornados ou selecionar os dados que o usuário deseja obter. É comum usar o `curl` para interagir com interfaces de programação de aplicações (APIs).

Um exemplo simples é o site ipify, que oferece uma API para verificar seu endereço IP externo.

curl https://api.ipify.org

Ao adicionar o parâmetro `format` com o valor “json”, podemos requisitar novamente nosso endereço IP, mas os dados serão retornados em formato JSON.

curl https://api.ipify.org?format=json

Outro exemplo é uma API do Google que retorna um objeto JSON descrevendo um livro. O parâmetro é o International Standard Book Number (ISBN) de um livro. Geralmente, ele está na contracapa, abaixo de um código de barras. Usaremos o parâmetro “0131103628”.

curl https://www.googleapis.com/books/v1/volumes?q=isbn:0131103628

Os dados retornados são extensos:

`curl` ou `wget`?

Se eu quisesse baixar conteúdo de um site e navegar recursivamente em toda sua estrutura, o `wget` seria minha escolha.

Se eu precisasse interagir com um servidor remoto ou API, e possivelmente baixar arquivos ou páginas web, usaria o `curl`. Principalmente se o protocolo desejado não fosse suportado pelo `wget`.