Conceitos Basicos de curl e wget: Comunicacao HTTP pela Linha de Comando
O Que Voce Vai Aprender
- A diferenca de funcao entre
curlewgetpara voce parar de adivinhar qual usar - Comandos essenciais para baixar arquivos, verificar headers e chamar APIs
- Por que iniciantes encontram "nada foi salvo," "redirecionamentos nao funcionam," e "caracteres estranhos" — e como corrigir cada um
- Templates para copiar e colar para inspecionar codigos de status HTTP e enviar JSON
Resumo Rapido
- Download unico de arquivo →
wget URL - Acessar uma API, inspecionar headers ou POST →
curl URL - Quer seguir redirecionamentos →
curl -L URL - Download foi interrompido →
wget -c URL
Ambiente
- SO: Ubuntu / Linux tipico
curlgeralmente ja vem instalado. Instalewgetviasudo apt install wget- Focamos em HTTP/HTTPS (curl tambem suporta ftp, sftp, smtp, etc.)
1. curl vs wget: Funcoes Diferentes
Conclusao: wget e um downloader que salva por padrao; curl e um cliente HTTP que imprime.
Visao geral
| Aspecto | curl | wget |
|---|---|---|
| Comportamento padrao | Imprime no stdout | Salva como arquivo |
| Metodos HTTP | GET/POST/PUT/DELETE/... | Principalmente GET |
| Seguir redirecionamentos | Precisa da flag -L |
Automatico |
| Download recursivo | Fraco | Forte (-r) |
| Retomar | -C - |
-c |
| Melhor para | APIs, depuracao, POST | Espelhar sites, downloads grandes |
Regra pratica: APIs, headers ou POST envolvidos → curl. Apenas baixar um arquivo → wget.
2. Basico do curl: Imprimir Antes de Salvar
Conclusao: curl imprime na tela por padrao; adicione -o nome ou -O para salvar em arquivo.
2-1. Acessar uma URL e Imprimir a Resposta
$ curl https://example.com
<!doctype html>
<html>
<head>
<title>Example Domain</title>
...
-o (especificar nome) ou -O (usar o nome do arquivo da URL).2-2. Salvar Com um Nome Personalizado: -o
$ curl -o page.html https://example.com
-o significa output. o minusculo recebe um nome de arquivo como argumento.
2-3. Salvar Usando o Nome do Arquivo da URL: -O
$ curl -O https://example.com/sample.tar.gz
O maiusculo salva usando o nome do arquivo final da URL (sample.tar.gz neste caso).
Confundir -o e -O acaba em lagrimas
-Orequer que a URL termine com um nome de arquivo realcurl -O https://example.com/(barra final) falha — nao ha nome de arquivo para usar- Na duvida, use
-o nomee seja explicito
2-4. Mostrar Progresso do Download
$ curl -O --progress-bar https://example.com/big.iso
--progress-bar mostra uma barra de progresso limpa — util para transferencias longas.
3. A Armadilha #1 para Iniciantes: Redirecionamentos e -L
Conclusao: curl nao segue redirecionamentos por padrao; adicione -L para chegar na pagina final.
https://github.com/torvalds/linux e a resposta parece errada...-L explicitamente para faze-lo seguir redirecionamentos.3-1. Seguir Redirecionamentos Com -L
# RUIM: apenas o placeholder de redirecionamento e retornado $ curl https://github.com/torvalds/linux # BOM: buscar o destino final $ curl -L https://github.com/torvalds/linux
-L significa Location (o header HTTP Location).
Memorize o padrao
- Ao acessar sites externos com curl, sempre adicione
-Lpara evitar surpresas - Downloads de arquivos frequentemente requerem
-Ltambem (GitHub Releases, redirecionamentos S3, etc.)
# Padrao seguro padrão $ curl -LO https://github.com/some/repo/releases/download/v1.0/binary.tar.gz
4. Inspecionar Apenas Headers Com -I
Conclusao: -I busca apenas headers sem o corpo; o codigo de status revela o estado.
Quer verificar "este link esta ativo?" ou "para onde este redirecionamento leva?" sem baixar o corpo? Use -I.
$ curl -I https://example.com
HTTP/2 200 content-type: text/html; charset=UTF-8 content-length: 1256 date: Sun, 26 May 2026 09:00:00 GMT server: ECS
HTTP/2 200 significa "sucesso," certo?Tabela de referencia de status HTTP
| Codigo | Significado | Exemplos |
|---|---|---|
2xx |
Sucesso | 200 OK, 204 No Content |
3xx |
Redirecionamento | 301 (permanente), 302 (temp) |
4xx |
Erro do cliente | 404 (nao encontrado), 401/403 |
5xx |
Erro do servidor | 500 (bug), 503 (sobrecarga) |
4-1. Rastrear Para Onde um Redirecionamento Leva
$ curl -ILs https://bit.ly/3xxxxx | grep -i location
-L segue redirecionamentos, -s silencia o progresso, -I mostra apenas headers. As linhas location: revelam cada salto.
5. POST e JSON: Comunicando-se com APIs
Conclusao: Acesse APIs com tres flags: -X para o metodo, -H para headers, -d para o corpo.
-X para o metodo HTTP, -H para headers e -d para o corpo. Lembre dessas tres flags e pronto.5-1. GET Com Parametros de Query
$ curl "https://api.example.com/users?id=42"
Sempre coloque URLs contendo ? e & entre aspas — caso contrario, o shell interpreta & como execucao em background.
5-2. POST JSON
$ curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name":"lina","role":"beginner"}'O combo de tres flags
-X POST: metodo HTTP explicito (opcional com-d, mas explicito e mais seguro)-H "Content-Type: application/json": declarar "isto e JSON"-d '...': o corpo da requisicao. Use aspas simples para que as"internas nao precisem de escape
5-3. Autenticacao com Bearer Token
$ curl https://api.example.com/me \
-H "Authorization: Bearer YOUR_TOKEN_HERE"Mantenha tokens fora do historico do shell
# RUIM: visivel em `history` e `ps` $ curl -H "Authorization: Bearer abc123..." ... # BOM: passe via variavel de ambiente $ export API_TOKEN=abc123... $ curl -H "Authorization: Bearer $API_TOKEN" ...
Tokens visiveis em history ou ps sao um incidente esperando para acontecer. Use variaveis de ambiente ou ~/.netrc.
5-4. Autenticacao Basica
$ curl -u username:password https://example.com/private
-u aceita user:pass. Apenas HTTPS.
6. A Forca do wget: Downloads Confiaveis
Conclusao: wget salva por padrao e segue redirecionamentos; -O renomeia, -c retoma um download.
6-1. Basico: Salvar como Arquivo
$ wget https://example.com/sample.tar.gz
6-2. Salvar Com um Nome Personalizado: -O
$ wget -O custom.tar.gz https://example.com/sample.tar.gz
-O tem significado oposto no curl e wget
-Odo curl: salvar usando o nome do arquivo da URL-Odo wget: especificar o nome do arquivo (equivalente ao-odo curl)
Todo mundo que usa ambos cai nessa pelo menos uma vez.
6-3. Retomar um Download Interrompido: -c
$ wget -c https://example.com/big.iso
-c significa continue. Se sua conexao caiu no meio, isso retoma de onde parou em vez de reiniciar.
6-4. Tentativas e Timeouts
$ wget --tries=5 --timeout=30 https://example.com/file.zip
Sobrevive a redes instáveis com novas tentativas.
7. Download Recursivo wget -r (Use com Cuidado)
Conclusao: wget -r percorre links recursivamente; sempre limite a profundidade com -l e o escopo com -np.
$ wget -r -l 2 -np https://example.com/docs/
-r: percorrer links recursivamente-l 2: limitar profundidade a 2 niveis-np: nao subir para diretorios pais
Coisas que voce nao deve fazer
- Executar
-rsem limites → voce pode baixar o site inteiro - Bombardear o servidor com requisicoes rapidas → parece um ataque DoS
- Ignorar
robots.txt→ viola os termos de servico
Adicione --wait=2 para espacar requisicoes, delimite a URL com precisao e verifique a politica do site primeiro.
8. Armadilhas de Encoding e Fim de Linha
Conclusao: curl e wget entregam bytes brutos; corrija encoding com iconv e CRLF com tr.
< e caracteres estranhos. Nao consigo ler.iconv. Para dados estruturados como JSON, use um parser como jq.\r\n (CRLF). No Linux, remova-os com dos2unix ou tr -d '\r'.# Converter Shift_JIS para UTF-8 ao salvar $ curl -s https://example.com/sjis.html | iconv -f SHIFT_JIS -t UTF-8 > page.html # Converter CRLF para LF $ curl -s https://windows-server.example/data.csv | tr -d '\r' > data.csv
9. Armadilhas Comuns para Iniciantes
Conclusao: Armadilhas comuns: esquecer -O/-o para salvar, esquecer -L e & sem aspas nas URLs.
9-1. curl URL Nao Salvou Nada
Causa: curl imprime no stdout por padrao. Para salvar, use -O ou -o.
$ curl -O https://example.com/file.zip $ curl -o my.zip https://example.com/file.zip
9-2. Recebeu a Pagina de Redirecionamento em Vez do Conteudo
Causa: esqueceu -L.
$ curl -L https://github.com/...
9-3. Query String Causa bash: command not found
Causa: o shell interpretou & como o operador de execucao em background.
# RUIM $ curl https://api.example.com/search?q=linux&page=2 # BOM $ curl "https://api.example.com/search?q=linux&page=2"
9-4. Erro de Certificado SSL
Causa: certificado auto-assinado, certificado expirado, CA interna, etc.
# Com verificacao (recomendado) $ curl https://internal.example.com # Pular verificacao (apenas emergencias — nunca em producao) $ curl -k https://internal.example.com
-k desabilita a verificacao, abrindo porta para ataques man-in-the-middle. Para producao, corrija a cadeia de certificados.
9-5. Ambiente de Proxy Nao Consegue Conectar
$ export http_proxy=http://proxy.example.com:8080 $ export https_proxy=http://proxy.example.com:8080 $ curl https://example.com
Em ambientes corporativos, configure http_proxy / https_proxy.
10. Mini Exercicios
Conclusao: Use httpbin.org para praticar verificacao de status, POST JSON e seguir redirecionamentos.
https://httpbin.org e um sandbox seguro para testes HTTP — acesse livremente.Exercicio 1: Verifique o codigo de status HTTP e o content-type de https://httpbin.org/get.
Mostrar dica
Ha uma flag que busca apenas headers.
Mostrar resposta
$ curl -I https://httpbin.org/get
HTTP/2 200 date: ... content-type: application/json ...
Exercicio 2: Envie o JSON {"hello":"world"} via POST para https://httpbin.org/post.
Mostrar dica
O combo de tres flags -X POST / -H / -d.
Mostrar resposta
$ curl -X POST https://httpbin.org/post \
-H "Content-Type: application/json" \
-d '{"hello":"world"}'Voce vera "json": {"hello": "world"} ecoado de volta na resposta.
Exercicio 3: Siga a cadeia de redirecionamentos em https://httpbin.org/redirect/3 e busque a pagina final.
Mostrar dica
Voce precisa da flag que segue redirecionamentos.
Mostrar resposta
$ curl -L https://httpbin.org/redirect/3
Apos tres saltos ele chega em /get e retorna essa resposta.
11. Templates para Copiar e Colar
Conclusao: Templates de curl e wget para copiar e colar para salvar, redirecionamentos, headers e POST.
Templates do curl
# Imprimir na tela (depuracao)
curl URL
# Salvar (usando nome do arquivo da URL)
curl -O URL
# Salvar (nome personalizado)
curl -o nome URL
# Seguir redirecionamentos e salvar (GitHub Releases, etc.)
curl -LO URL
# Apenas headers
curl -I URL
# Obter apenas o codigo de status
curl -s -o /dev/null -w "%{http_code}\n" URL
# POST JSON
curl -X POST URL \
-H "Content-Type: application/json" \
-d '{"key":"value"}'
# Bearer token
curl URL -H "Authorization: Bearer $API_TOKEN"
# Autenticacao basica
curl -u user:pass URL
# Com barra de progresso
curl -O --progress-bar URLTemplates do wget
# Download basico wget URL # Salvar com nome personalizado wget -O custom.name URL # Retomar um download interrompido wget -c URL # Tentativas e timeout wget --tries=5 --timeout=30 URL # Download silencioso (log minimo) wget -q URL # Recursivo (com boas maneiras) wget -r -l 2 -np --wait=2 https://example.com/docs/