Como usar curl para baixar arquivos da linha de comando do Linux

O comando Linux curl pode fazer muito mais do que baixar arquivos. Descubra do que o curl é capaz e quando você deve usá-lo em vez do wget.

curl vs. wget: Qual é a diferença?

As pessoas geralmente lutam para identificar os pontos fortes relativos dos comandos wget e curl. Os comandos têm alguma sobreposição funcional. Cada um deles pode recuperar arquivos de locais remotos, mas é aí que termina a semelhança.

wget é um ferramenta fantástica para baixar conteúdo e arquivos. Ele pode baixar arquivos, páginas da web e diretórios. Ele contém rotinas inteligentes para percorrer links em páginas da web e fazer download recursivamente de conteúdo em um site inteiro. É insuperável como gerenciador de download de linha de comando.

curl satisfaz uma necessidade totalmente diferente. Sim, ele pode recuperar arquivos, mas não pode navegar recursivamente em um site à procura de conteúdo para recuperar. O que o curl realmente faz é permitir que você interaja com sistemas remotos fazendo solicitações a esses sistemas e recuperando e exibindo suas respostas para você. Essas respostas podem ser arquivos e conteúdo de página da web, mas também podem conter dados fornecidos por meio de um serviço da web ou API como resultado da “pergunta” feita pela solicitação curl.

E o curl não se limita a sites. curl suporta mais de 20 protocolos, incluindo HTTP, HTTPS, SCP, SFTP e FTP. E, sem dúvida, devido ao seu manuseio superior de canais do Linux, curl pode ser mais facilmente integrado com outros comandos e scripts.

O autor do curl tem uma página da web que descreve as diferenças que ele vê entre curl e wget.

Instalando curl

Dos computadores usados ​​para pesquisar este artigo, o Fedora 31 e o Manjaro 18.1.0 já tinham o curl instalado. curl teve que ser instalado no Ubuntu 18.04 LTS. No Ubuntu, execute este comando para instalá-lo:

sudo apt-get install curl

A versão curl

A opção –version torna curlreport sua versão. Ele também lista todos os protocolos compatíveis.

curl --version

Recuperando uma página da web

Se apontarmos o curl para uma página da web, ele a recuperará para nós.

curl https://www.bbc.com

Mas sua ação padrão é despejá-lo na janela do terminal como código-fonte.

  Como executar aplicativos Android no Linux

Cuidado: se você não disser ao curl que deseja algo armazenado como um arquivo, ele sempre irá despejá-lo na janela do terminal. Se o arquivo que está recuperando for um arquivo binário, o resultado pode ser imprevisível. O shell pode tentar interpretar alguns dos valores de byte no arquivo binário como caracteres de controle ou sequências de escape.

Salvando dados em um arquivo

Vamos dizer ao curl para redirecionar a saída para um arquivo:

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

curl https://www.bbc.com> bbc.html em uma janela de terminal ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> Desta vez, não vemos a informação recuperada, ela é enviada diretamente para o arquivo para nós.  Como não há saída de janela de terminal para exibir, curl gera um conjunto de informações de progresso. </p>
<p> Não fez isso no exemplo anterior porque as informações de progresso estariam espalhadas por todo o código-fonte da página da web, então curl suprimiu automaticamente. </p>
<p> Neste exemplo, curl detecta que a saída está sendo redirecionada para um arquivo e que é seguro gerar as informações de progresso. </p>
<p> <img src =

As informações fornecidas são:

% Total: O valor total a ser recuperado.
% Recebido: a porcentagem e os valores reais dos dados recuperados até o momento.
% Xferd: A porcentagem e o envio real, se os dados estão sendo carregados.
Average Speed ​​Dload: A velocidade média de download.
Velocidade média de upload: a velocidade média de upload.
Tempo total: a duração total estimada da transferência.
Tempo gasto: o tempo decorrido até o momento para esta transferência.
Tempo restante: o tempo estimado restante para a conclusão da transferência
Velocidade atual: a velocidade de transferência atual para esta transferência.

Como redirecionamos a saída de curl para um arquivo, agora temos um arquivo chamado “bbc.html”.

Clicar duas vezes nesse arquivo abrirá seu navegador padrão para que ele exiba a página da web recuperada.

Observe que o endereço na barra de endereço do navegador é um arquivo local neste computador, não um site remoto.

Não precisamos redirecionar a saída para criar um arquivo. Podemos criar um arquivo usando a opção -o (saída) e dizendo ao curl para criar o arquivo. Aqui, estamos usando a opção -o e fornecendo o nome do arquivo que desejamos criar “bbc.html”.

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

Usando uma barra de progresso para monitorar downloads

Para que as informações de download baseadas em texto sejam substituídas por uma barra de progresso simples, use a opção – # (barra de progresso).

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

Reiniciando um download interrompido

É fácil reiniciar um download que foi encerrado ou interrompido. Vamos começar o download de um arquivo considerável. Usaremos a versão mais recente do suporte de longo prazo do Ubuntu 18.04. Estamos usando a opção –output para especificar o nome do arquivo em que desejamos salvá-lo: “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 segue seu caminho até a conclusão.

  Como remover dados redundantes no Linux com Fdupes

Se interrompermos o download à força com Ctrl + C, voltaremos ao prompt de comando e o download será abandonado.

Para reiniciar o download, use a opção -C (continuar em). Isso faz com que o curl reinicie o download em um ponto especificado ou deslocamento dentro do arquivo de destino. Se você usar um hífen – como o deslocamento, o curl examinará a parte já baixada do arquivo e determinará o deslocamento correto a ser usado.

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

O download é reiniciado. curl relata o deslocamento no qual ele está reiniciando.

Recuperando cabeçalhos HTTP

Com a opção -I (head), você pode recuperar apenas os cabeçalhos HTTP. Isso é o mesmo que enviar o Comando HTTP HEAD para um servidor web.

curl -I www.twitter.com

Este comando recupera apenas informações; ele não baixa nenhuma página da web ou arquivos.

Baixando vários URLs

Usando o xargs, podemos baixar vários URLs de uma vez só. Talvez queiramos baixar uma série de páginas da web que constituem um único artigo ou tutorial.

Copie esses URLs para um editor e salve-os em um arquivo chamado “urls-to-download.txt”. Podemos usar xargs para trate o conteúdo de cada linha do arquivo de texto como um parâmetro que alimentará para curl, por sua vez.

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 usar para que o xargs passe esses URLs para enrolar um de cada vez:

xargs -n 1 curl -O 

Note that this command uses the -O (remote file) output command, which uses an uppercase “O.” This option causes curl to save the retrieved  file with the same name that the file has on the remote server.

The -n 1 option tells xargs to treat each line of the text file as a single parameter.

When you run the command, you’ll see multiple downloads start and finish, one after the other.

Checking in the file browser shows the multiple files have been downloaded. Each one bears the name it had on the remote server.

Downloading Files From an FTP Server

Using curl with a File Transfer Protocol (FTP) server is easy, even if you have to authenticate with a username and password. To pass a username and password with curl use the -u (user) option, and type the username, a colon “:”, and the password. Don’t put a space before or after the colon.

This is a free-for-testing FTP server hosted by Rebex. The test FTP site has a pre-set username of “demo”, and the password is “password.” Don’t use this type of weak username and password on a production or “real” FTP server.

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

curl descobre que o estamos apontando para um servidor FTP e retorna uma lista dos arquivos que estão presentes no servidor.

O único arquivo neste servidor é um arquivo “readme.txt”, de 403 bytes de comprimento. Vamos recuperá-lo. Use o mesmo comando de um momento atrás, com o nome do arquivo anexado a ele:

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

O arquivo é recuperado e curl exibe seu conteúdo na janela do terminal.

Em quase todos os casos, será mais conveniente ter o arquivo recuperado salvo em disco para nós, em vez de exibido na janela do terminal. Mais uma vez podemos usar o comando de saída -O (arquivo remoto) para que o arquivo seja salvo no disco, com o mesmo nome de arquivo que possui no 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 do arquivo no servidor FTP e o mesmo comprimento, 403 bytes.

ls -hl readme.txt

Enviando Parâmetros para Servidores Remotos

Alguns servidores remotos aceitarão parâmetros em solicitações enviadas a eles. Os parâmetros podem ser usados ​​para formatar os dados retornados, por exemplo, ou podem ser usados ​​para selecionar os dados exatos que o usuário deseja recuperar. Muitas vezes é possível interagir com a web interfaces de programação de aplicativos (APIs) usando curl.

Como um exemplo simples, o ipify o site tem uma API que pode ser consultada para verificar seu endereço IP externo.

curl https://api.ipify.org

Ao adicionar o parâmetro de formato ao comando, com o valor de “json”, podemos solicitar novamente nosso endereço IP externo, mas desta vez os dados retornados serão codificados no Formato JSON.

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

Aqui está outro exemplo que usa uma API do Google. Ele retorna um objeto JSON que descreve um livro. O parâmetro que você deve fornecer é o Número de livro padrão internacional (ISBN) número de um livro. Você pode encontrá-los na contracapa da maioria dos livros, geralmente abaixo de um código de barras. O parâmetro que usaremos aqui é “0131103628”.

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

Os dados retornados são abrangentes:

Às vezes curl, às vezes wget

Se eu quisesse baixar conteúdo de um site e ter a estrutura em árvore do site pesquisada recursivamente por esse conteúdo, eu usaria o wget.

Se eu quisesse interagir com um servidor remoto ou API, e possivelmente baixar alguns arquivos ou páginas da web, usaria curl. Especialmente se o protocolo for um dos muitos não suportados pelo wget.