Ravakahn Gladior
Ravakahn Gladior Ravakahn foi um gladiador que, na Roma Antiga, lutava com outros gladiadores ou animais, às vezes, até a morte, para o entretenimento do público romano. há 4 anos

Use a internet com a linha de comando com o curl

Use a internet com a linha de comando com o curl

Curl é normalmente considerado um navegador não interativo. Isto signifoca que é possível baixar informações da internet e exibi-las em seu terminal ou salva-la em um arquivo. Isto é literalmente um navegador web, como Firefox ou Chromium, exceto que eles renderizam a informação por padrão, enquanto o curl baixa e mostra a informação crua. Na realidade, o comando curl faz muito mais e tem a capacidade de transferir dados de ou para um servidor usando um dos muitos protocolos suportados, incluindo HTTP, FTP, SFTP, IMAP, POP3, LDAP, SMB, SMTP, etc. É uma ferramenta útil para o usuário com conhecimentos intermediários de terminal e muito conveniente para o administrador de sistemas.

O Curl foi projetado para funcionar sem a interação do usuário. Portanto, ao contrário dos navegadores web comuns, você deve pensar na sua interação com os dados online do início ao fim. Por exemplo, se você deseja visualizar uma página da web no Firefox, inicia uma aba no Firefox. Após a abertura da aba, você digita o endereço do site que deseja visitar no campo URL ou em um mecanismo de pesquisa. Em seguida, navegue até o site e clique na página que deseja ver.

Os mesmos conceitos se aplicam ao curl, exceto que você faz tudo de uma só vez: você inicia o curl ao mesmo tempo em que insere o endereço na internet e diz se deseja que os dados sejam salvos no seu terminal ou em um arquivo. A complexidade aumenta quando você precisa interagir com um site que requer autenticação ou com uma API, mas depois que você aprende a sintaxe do comando curl, ela se torna uma ferramenta muito simples de utilizada. Para ajudá-lo, encontramos um cheat cheet da sintaxe do curl.

Sumário

Baixe um arquivo com curl

Você pode baixar um arquivo com o curl fornecendo um endereço para um URL específico e o arquivo que você baixou será exibido na tela do terminal. Você pode redirecionar a saída para comandos less ou tail ou qualquer outro comando:

$ curl "http://example.com" | tail -n 4

Isto irá gerar uma saída semelhante a:

<h1>Exemplo de titulo</h1>
<p>Este domínio é utilizado como exemplos de documentos ilustrativos.</p>
<p><a href="more.html">Mais informações</a></p>
</div></body></html>

Como alguns URLs contêm caracteres especiais que seu shell normalmente interpreta, é mais seguro colocar o URL entre aspas.

Alguns arquivos não podem ser traduzidos para caracteres para então serem exibidos no terminal. Você pode usar a opção --remote-name para fazer com que o arquivo seja salvo no seu disco com o nome original:

$ curl --remote-name "https://ubuntu.com/last-distro.iso"
$ ls
last-distro.iso

Como alternativa, você pode usar a opção --output para nomear seu download como desejar:

$ curl "https://ubuntu.com/last-distro.iso" --output ubuntu.iso
$ ls
ubuntu.iso

Listar o conteúdo de um diretório remoto com curl

Como o curl não é interativo, é difícil procurar uma página em busca de elementos para download. Desde que o servidor remoto ao qual você está se conectando permita, você pode usar curl para listar o conteúdo de um diretório:

$ curl --list-only "https://ubuntu.com/foo/"

Continuar um download parcial

Se você estiver baixando um arquivo muito grande, poderá interromper o download e continuar em outro momento. O curl esta preparado para determinar de onde você parou e continuar o download. Isso significa que na próxima vez que você baixar um arquivo grande e algo der errado, você não precisará voltar ao início. A sintaxe de --continue-at não é muito usual: se você sabe de onde o download foi interrompido, você pode informar (em bytes) esse local de interrupção. Caso contrário, você pode usar um traço (-) para dizer ao curl para detectá-lo automaticamente:

$ curl --remote-name --continue-at - "https://ubuntu.com/last-distro.iso"

Baixar uma sequência de arquivos

Se você precisar fazer o download de vários arquivos, em vez de apenas um arquivo grande, o curl pode ajudar com isso. Supondo que você conheça o local e o padrão de nome dos arquivos que deseja baixar, você pode usar a notação de sequenciamento de curl: o ponto inicial e final entre um intervalo de números inteiros, entre colchetes. Para o nome do arquivo de saída, use #1 para indicar a primeira variável:

$ curl "https://site.com.br/arquivo_[1-4].webp" --output "arquivo_#1.webp"

Se você precisar usar outra variável para representar outra sequência, denote cada variável na ordem em que aparece no comando. Por exemplo, neste comando, o #1 refere-se aos diretórios dir_000 a dir_009, enquanto o #2 refere-se aos arquivos fig_1.webp a fig_4.webp:

$ curl "https://site.com.br/dir_00[0-9]/fig_[1-4].webp" --output "fig_#1-#2.webp"

Baixar todos os arquivos PNG de um site

Você pode fazer alguns rascunhos simples na web para encontrar o que deseja baixar também usando apenas curl e grep. Por exemplo, suponha que você precise baixar todas as imagens associadas a uma página da web que está arquivando. Primeiro, faça o download da página que faz referência às imagens. Canalize a página para grep com uma pesquisa pelo tipo de imagem que você está segmentando (PNG neste exemplo). Por fim, crie um loop while para construir uma URL de download e salvar os arquivos no seu computador:

$ curl https://site.com.br |\
grep --only-matching 'src="[^"]*.[png]"' |\
cut -d\" -f2 |\
while read i; do \
curl https://site.com.br/"${i}" -o "${i##*/}"; \
done

Este é apenas um exemplo, mas mostra como o curl pode ser flexível quando combinado com outras ferramentas.

Buscar cabeçalhos HTML

Os protocolos usados para troca de dados têm uma grande quantidade de metadados. Os cabeçalhos HTTP são componentes da parte inicial dos dados. Pode ser útil exibir esses cabeçalhos (especialmente o código de resposta) ao solucionar problemas de conexão com um site:

$ curl --head "https://example.com"
HTTP/2 200
accept-ranges: bytes
age: 485487
cache-control: max-age=604800
content-type: text/html; charset=UTF-8
date: Sun, 26 Apr 2020 09:02:09 GMT
etag: "3147526947"
expires: Sun, 03 May 2020 09:02:09 GMT
last-modified: Thu, 17 Oct 2019 07:18:26 GMT
server: ECS (sjc/4E76)
x-cache: HIT
content-length: 1256

Falha rápida

Uma resposta 200 é o indicador HTTP de sucesso; portanto, é o que você normalmente espera quando entra em contato com um servidor. O famoso 404 indica que uma página não pode ser encontrada e 500 significa que houve um erro no servidor.

Para ver quais erros estão acontecendo durante a negociação, adicione a flag --show-error:

$ curl --head --show-error "http://site.com.br"

A menos que você tenha acesso ao servidor que você está entrando em contato, pode ser difícil corrigir o erro apresentado. O curl tenta fazer o melhor para encontrar e baixar o recurso da URL que você forneceu. Às vezes, ao testar coisas em uma rede, as várias tentativas do curl pode fazer você perder muito tempo, e você pode forçar o curl a sair rapidamente após a falha com a flag --fail-early:

$ curl --fail-early "http://site.com.br"

Redirecionamento automático em respostas 3xx

As respostas 3xx são flexíveis. Especificamente, a resposta 301 significa que um URL foi movido permanentemente para um local diferente. É uma maneira comum de um administrador alterar o endereço do recurso e deixar um "rastro" para que as pessoas que visitam o local antigo ainda possam encontrá-lo. O curl não segue uma resposta 301 por padrão, mas você pode fazê-lo adicionando a flag --location:

$ curl "http://site.com.br" | grep title
<title>301 Moved Permanently</title>
$ curl --location "http://site.com.br"
<title>Minha página em novo endereço</title>

Expandir uma URL encurtada

A flag --location é útil quando você deseja procurar URLs encurtados antes de visitá-los. URLs encurtados podem ser úteis para redes sociais com limites de caracteres (é claro, isso pode não ser um problema se você usar uma rede social moderna e de código aberto) ou para mídias impressas nas quais os usuários não podem simplesmente copiar e colar um URL longo. No entanto, eles também podem ser um pouco perigosos porque seu destino é, por natureza, oculto. Ao combinar a opção --head para exibir apenas os cabeçalhos HTTP e a opção --location para desvendar o destino final de uma URL, você pode espiar uma URL reduzida sem carregar o recurso completo:

$ curl --head --location \
"https://bit.ly/2xDwSAT"

Baixe o cheat sheet curl

Depois que você pratica a sua cabeça sobre o processo de explorar a Web como um único comando, o curl se torna uma maneira rápida e eficiente de extrair as informações necessárias da Internet sem se preocupar com uma interface gráfica. Para ajudr a incorporar ao seu fluxo de trabalho, disponibilizo um cheat sheet com dicas de usos e sintaxe comuns, incluindo uma visão geral do uso para consultar uma API.