Curl e wget: requisições HTTP no terminal
1. Introdução às ferramentas
Curl e wget são duas das ferramentas mais essenciais para qualquer profissional que trabalhe com Bash/Shell Script. Ambas permitem realizar requisições HTTP diretamente do terminal, mas possuem origens e focos distintos.
O curl (Client URL) foi criado por Daniel Stenberg em 1997 e suporta dezenas de protocolos além do HTTP/HTTPS, como FTP, SFTP, SCP, LDAP e muitos outros. É amplamente utilizado em scripts para integração com APIs REST e automação de tarefas web.
O wget (World Wide Web Get) foi desenvolvido por Hrvoje Nikšić em 1996, com foco principal em download de arquivos e páginas web. Sua grande vantagem está no download recursivo e na capacidade de retomar downloads interrompidos.
Diferenças fundamentais:
- Curl é mais adequado para requisições complexas e interação com APIs
- Wget é superior para downloads em lote e mirror de sites
- Curl exibe o conteúdo no terminal por padrão; wget salva em arquivo
- Wget lida melhor com downloads interrompidos (resume)
Instalação e verificação:
# Verificar se estão instalados
curl --version
wget --version
# Instalação no Ubuntu/Debian
sudo apt install curl wget
# Instalação no CentOS/RHEL
sudo yum install curl wget
2. Requisições básicas com curl
A sintaxe fundamental do curl é simples e direta:
# Exibir conteúdo de uma URL no terminal
curl https://api.github.com
# Salvar resposta em arquivo com nome específico
curl -o meu_arquivo.json https://api.github.com
# Salvar resposta com o nome original do servidor
curl -O https://exemplo.com/arquivo.pdf
O parâmetro -o permite definir o nome do arquivo de saída, enquanto -O mantém o nome original fornecido pelo servidor.
3. Requisições básicas com wget
O wget tem comportamento diferente: por padrão, ele salva o conteúdo em arquivo:
# Download simples (salva como index.html ou nome do arquivo)
wget https://exemplo.com
# Especificar diretório de saída
wget -P /tmp/downloads https://exemplo.com/arquivo.zip
# Renomear arquivo baixado
wget -O backup.zip https://exemplo.com/arquivo.zip
O wget é particularmente útil para downloads que exigem confiabilidade, pois tenta automaticamente retomar conexões interrompidas com -c:
# Retomar download interrompido
wget -c https://exemplo.com/grande_arquivo.iso
4. Cabeçalhos e métodos HTTP
Para trabalhar com APIs e serviços web, é essencial controlar métodos HTTP e cabeçalhos:
# Métodos HTTP com curl
curl -X GET https://api.exemplo.com/usuarios
curl -X POST https://api.exemplo.com/usuarios
curl -X PUT https://api.exemplo.com/usuarios/1
curl -X DELETE https://api.exemplo.com/usuarios/1
# Cabeçalhos personalizados com curl
curl -H "Content-Type: application/json" -H "X-Custom-Header: valor" https://api.exemplo.com
# Visualizar cabeçalhos de resposta
curl -I https://google.com
# Cabeçalhos com wget
wget --header="Accept: application/json" https://api.exemplo.com
wget --server-response https://exemplo.com
5. Envio de dados e formulários
O envio de dados é uma operação frequente em scripts de automação:
# Dados via query string (GET)
curl "https://api.exemplo.com/busca?q=linux&pagina=1"
# Dados POST com curl
curl -X POST -d "nome=Joao&email=joao@email.com" https://api.exemplo.com/usuarios
# Dados POST em formato JSON
curl -X POST -H "Content-Type: application/json" -d '{"nome":"Joao","email":"joao@email.com"}' https://api.exemplo.com/usuarios
# Upload de arquivo com curl
curl -F "foto=@/caminho/imagem.jpg" https://api.exemplo.com/upload
# POST com wget
wget --post-data="nome=Joao&email=joao@email.com" https://api.exemplo.com/usuarios
6. Autenticação e cookies
A autenticação é fundamental para acessar recursos protegidos:
# Autenticação básica HTTP
curl -u usuario:senha https://api.exemplo.com/protegido
wget --user=usuario --password=senha https://api.exemplo.com/protegido
# Token Bearer (JWT, OAuth)
curl -H "Authorization: Bearer SEU_TOKEN_AQUI" https://api.exemplo.com/dados
# Gerenciamento de cookies com curl
curl -c cookies.txt -b cookies.txt https://site.com/login
# Salvar e carregar cookies com wget
wget --save-cookies=cookies.txt --load-cookies=cookies.txt https://site.com/login
7. Opções avançadas e boas práticas
Para scripts robustos, é importante controlar tempo, velocidade e comportamento:
# Timeout e limite de velocidade
curl --max-time 30 --limit-rate 100K https://exemplo.com/arquivo.zip
wget --timeout=30 --limit-rate=100K https://exemplo.com/arquivo.zip
# Seguir redirecionamentos
curl -L https://exemplo.com/pagina-redirecionada
# wget segue redirecionamentos por padrão
# Download recursivo com wget
wget -r -l 2 --accept=pdf,doc https://exemplo.com/documentos/
# Verbosidade e debug
curl -v https://api.exemplo.com
wget --debug https://exemplo.com
O parâmetro -r ativa o download recursivo no wget, -l define a profundidade e --accept filtra tipos de arquivo.
8. Scripts práticos com curl e wget
Monitoramento de disponibilidade de sites
#!/bin/bash
URL="https://meusite.com"
HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" $URL)
if [ $HTTP_CODE -eq 200 ]; then
echo "Site online - Código: $HTTP_CODE"
else
echo "ALERTA: Site retornou código $HTTP_CODE"
fi
Download automatizado de múltiplos arquivos
#!/bin/bash
ARQUIVOS=("documento1.pdf" "documento2.pdf" "documento3.pdf")
BASE_URL="https://exemplo.com/downloads"
for ARQ in "${ARQUIVOS[@]}"; do
echo "Baixando $ARQ..."
wget -c "$BASE_URL/$ARQ" || echo "Falha ao baixar $ARQ"
done
Integração com API REST
#!/bin/bash
API_URL="https://api.github.com"
TOKEN="seu_token_github"
# Listar repositórios do usuário
curl -s -H "Authorization: token $TOKEN" "$API_URL/user/repos" | \
jq '.[].name'
# Criar issue via POST
curl -s -X POST \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"Bug encontrado","body":"Descrição do bug"}' \
"$API_URL/repos/usuario/repo/issues"
Referências
- Documentação oficial do curl — Manual completo com todas as opções, exemplos e guias de uso do curl
- Manual do GNU Wget — Documentação oficial do wget com todos os parâmetros e exemplos detalhados
- Everything curl - O livro — Guia abrangente sobre curl, desde conceitos básicos até uso avançado em scripts
- DevHQA: Curl Command Tutorial — Tutoriais práticos com exemplos de requisições HTTP, autenticação e manipulação de dados
- Shell Scripting with curl and wget — Dicas e truques para usar curl e wget em shell scripts do mundo real
- HTTP Bin - Teste suas requisições — Serviço online para testar requisições HTTP, ideal para aprender curl e wget na prática
- ExplainShell: Curl examples — Ferramenta que explica cada parte de comandos curl, útil para entender opções complexas