Conceitos Básicos de curl e wget: Comunicação HTTP pela Linha de Comando
O que você vai conseguir fazer
- Escolher entre `curl` e `wget` conforme o objetivo da tarefa
- Conferir onde o arquivo baixado cai e se ele vai sobrescrever algo
- Seguir redirecionamentos, inspecionar headers e enviar JSON por POST copiando os exemplos
Pré-requisitos (leia estes primeiro)
O Que Você Vai Aprender
- A diferença de função entre
curlewget - Onde o arquivo baixado é criado, antes de baixar
- Como evitar sobrescrever um arquivo que você ainda precisa
- Como inspecionar headers e chamar APIs com comandos prontos para copiar
As palavras usadas aqui (organizadas antes)
- Download: copiar para a sua máquina dados que estão em outra máquina da rede.
- Redirecionamento: um aviso do servidor dizendo "esta página mudou de lugar". Não é o
>de redirecionamento do shellUm programa interativo que interpreta os comandos digitados e os executa.. Uma palavra, dois sentidos. - Header: uma etiqueta enviada junto com o corpo da resposta. Ela diz o tipo e o tamanho do conteúdo.
- Código de status: um número de três dígitos com o resultado.
200é sucesso,404é não encontrado. - API: uma porta que os programas usam para conversar entre si. A resposta costuma ser JSON, e não HTML.
Resumo Rápido
- Download único 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 típico
curlgeralmente já vem instalado. Instalewgetviasudo apt install wget- Focamos em HTTP/HTTPS (curl também suporta ftp, sftp, smtp, etc.)
1. curl vs wget: Funções Diferentes
Conclusão: wget é um downloader que salva por padrão; curl é um cliente HTTP que imprime.
Visão geral
| Aspecto | curl | wget |
|---|---|---|
| Comportamento padrão | Imprime no stdout | Salva como arquivo |
| Métodos HTTP | GET/POST/PUT/DELETE/... | Principalmente GET |
| Seguir redirecionamentos | Precisa da flag -L |
Automático |
| Download recursivo | Fraco | Forte (-r) |
| Retomar | -C - |
-c |
| Melhor para | APIs, depuração, POST | Espelhar sites, downloads grandes |
Regra prática: APIs, headers ou POST envolvidos → curl. Apenas baixar um arquivo → wget.
2. Básico do curl: Imprimir Antes de Salvar
Conclusão: curl imprime na tela por padrão; 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 (nome escolhido) ou -O (nome do arquivo da URL).2-2. Salvar Com um Nome Personalizado: -o
$ curl -o page.html https://example.com
-o vem de output. O o minúsculo recebe como argumento o nome que você quiser.
2-3. Salvar Usando o Nome do Arquivo da URL: -O
$ curl -O https://example.com/sample.tar.gz
O O maiúsculo reaproveita o nome no fim da URL. Aqui, sample.tar.gz.
Confundir -o com -O termina em lágrimas
-Oexige que a URL termine em um nome de arquivo realcurl -O https://example.com/(barra no fim) falha, pois não há nome para usar- Na dúvida, use
-o nomee seja explícito
2-4. Onde o Arquivo Cai? Ele Sobrescreve?
Antes de qualquer download, confira duas coisas: onde o arquivo é criado e o que acontece se o nome já existir.
Local de gravação e sobrescrita, antes de tudo
- O arquivo cai no diretórioUm local que organiza arquivos. É a mesma ideia da "pasta" do Windows ou macOS. em que você está agora. Confira com
pwd curl -Oecurl -osobrescrevem um arquivo de mesmo nome sem perguntar- Diferente de um gerenciador gráfico, não aparece nenhuma caixa de confirmação. O conteúdo antigo se perde
- Para bloquear a sobrescrita, use
curl --no-clobber -O URL. Se o nome já existir, o curl não faz nada - O
wgetnão sobrescreve por padrão. Ele salvasample.tar.gz.1, acrescentando um número - O
curle owgetnão rodam no terminal virtual deste site. Execute-os no terminal da sua máquina - Pratique dentro do diretório vazio criado em "10. Mini Exercícios". Lá nada do que você já tinha pode quebrar
curl -O e editei. Depois rodei o mesmo comando de novo. As minhas edições sumiram.ls antes de baixar para ver se o nome já está ocupado. Se quiser outro nome, escolha você mesma com -o. Esses dois hábitos evitam quase todos os acidentes.ls antes de baixar" teria me salvado.# Antes de baixar, confira onde voce esta e o que ja existe $ pwd $ ls sample.tar.gz # Quando a sobrescrita preocupa, escolha o nome voce mesma $ curl -o sample-20260605.tar.gz https://example.com/sample.tar.gz
2-5. Mostrar Progresso do Download
$ curl -O --progress-bar https://example.com/big.iso
--progress-bar mostra uma barra de progresso simples. Transferências longas ficam fáceis de acompanhar.
3. A Armadilha #1 para Iniciantes: Redirecionamentos e -L
Conclusão: curl não segue redirecionamentos por padrão; adicione -L para chegar na página final.
https://github.com/torvalds/linux e a resposta parece errada.-L, ele passa a seguir.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 vem de Location. Location é o header HTTP que carrega o novo endereço.
Memorize o padrão
- Ao acessar sites externos com curl, sempre adicione
-Lpara evitar surpresas - Downloads de arquivos também costumam exigir
-L(GitHub Releases, redirecionamentos S3, etc.)
# Padrao seguro $ curl -LO https://github.com/some/repo/releases/download/v1.0/binary.tar.gz
-LO é -L e -O unidos. Opções de uma letra podem ser combinadas assim. Escrever -L -O tem o mesmo efeito.
4. Inspecionar Apenas Headers Com -I
Conclusão: -I busca apenas headers sem o corpo; o código de status revela o estado.
Quer saber "este link está vivo?" 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 rápida de status HTTP
| Código | Significado | Exemplos |
|---|---|---|
2xx |
Sucesso | 200 OK, 204 No Content |
3xx |
Redirecionamento | 301 (permanente), 302 (temp) |
4xx |
Erro do cliente | 404 (não encontrado), 401 |
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
-ILs é -I, -L e -s combinados em um. -L segue redirecionamentos, -s silencia progresso e erros, -I mostra apenas headers. Cada salto acrescenta a sua linha location:, e a última é o destino final.
5. POST e JSON: Comunicando-se com APIs
Conclusão: Acesse APIs com três flags: -X para o método, -H para headers, -d para o corpo.
-X para o método HTTP, -H para headers e -d para o corpo. Lembre dessas três flags e pronto.5-1. GET Com Parâmetros de Query
$ curl "https://api.example.com/users?id=42"
Sempre coloque entre aspasEnvolver um texto entre aspas (' ou ") para que seja tratado como um único valor, por exemplo um que tenha espaços. as URLs com ? e &. Sem aspas, o shell lê & como execução em segundo plano.
5-2. POST JSON
$ curl -X POST https://api.example.com/users \
-H "Content-Type: application/json" \
-d '{"name":"lina","role":"beginner"}'A combinação de três flags
-X POST: o método HTTP. O-djá faz o curl enviar um POST, então normalmente você não precisa escrever isso-H "Content-Type: application/json": declara "isto é JSON"-d '...': o corpo da requisição. Use aspas simples para não precisar escapar as"internas
5-3. Autenticação com Bearer Token
$ curl https://api.example.com/me \
-H "Authorization: Bearer YOUR_TOKEN_HERE"Mantenha tokens fora do histórico 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 visíveis em history ou ps são um incidente esperando para acontecer. Use variáveis de ambiente ou ~/.netrc.
5-4. Autenticação Básica
$ curl -u username:password https://example.com/private
-u aceita user:pass. Use somente com HTTPS.
6. A Força do wget: Downloads Confiáveis
Conclusão: wget salva por padrão e segue redirecionamentos; -O renomeia, -c retoma um download.
6-1. Básico: Salvar como Arquivo
$ wget https://example.com/sample.tar.gz
O wget não sobrescreve por conta própria
Se o nome já estiver ocupado, o wget salva sample.tar.gz.1, ou seja, o mesmo nome com um número. A exceção é -O nome: essa forma sobrescreve o nome informado. Guarde essa diferença.
6-2. Salvar Com um Nome Personalizado: -O
$ wget -O custom.tar.gz https://example.com/sample.tar.gz
-O significa o oposto em curl e wget
-Odo curl: salva usando o nome do arquivo da URL-Odo wget: especifica o nome do arquivo (equivalente ao-odo curl)
Todo mundo que usa os dois cai nessa pelo menos uma vez.
6-3. Retomar um Download Interrompido: -c
$ wget -c https://example.com/big.iso
-c vem de continue. Se a conexão caiu no meio, ele continua de onde parou em vez de recomeçar.
6-4. Tentativas e Timeouts
$ wget --tries=5 --timeout=30 https://example.com/file.zip
Sobrevive a redes instáveis tentando de novo.
7. Download Recursivo wget -r (Use com Cuidado)
Conclusão: 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: percorre os links recursivamente-l 2: limita a profundidade a 2 níveis-np: não sobe para diretórios pai
Coisas que você não deve fazer
- Rodar
-rsem limites → você pode baixar o site inteiro - Martelar o servidor sem pausa → parece um ataque de negação de serviço
- Ignorar o
robots.txt→ viola os termos de uso
Adicione --wait=2 para espaçar as requisições, limite bem a URL e confira antes a política do site.
8. Armadilhas de Encoding e Fim de Linha
Conclusão: curl e wget entregam bytes brutos; corrija encoding com iconv e CRLF com tr.
iconv.\r\n (CRLF). No Linux, remova 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
Aqui o > é o redirecionamento do shell. Ele também substitui o conteúdo do arquivo alvo sem perguntar. Não aponte para um nome que você ainda precisa.
9. Armadilhas Comuns para Iniciantes
Conclusão: Armadilhas comuns: esquecer -O/-o para salvar, esquecer -L e & sem aspas nas URLs.
9-1. curl URL Não Salvou Nada
Causa: o curl imprime no stdout por padrão. 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 Página de Redirecionamento em Vez do Conteúdo
Causa: esqueceu o -L.
$ curl -L https://github.com/...
9-3. Parte da Query e Ignorada, ou Aparece um Erro Estranho
Causa: o shell leu & como o operador de execução em segundo plano. Tudo antes do & vai para o curl; o resto vira outro comando.
- Com
&page=2(existe um=): nenhum erro aparece. O&page=2é descartado em silêncio e só o resultado muda. Este é o caso mais difícil de perceber - Com
&page(sem=): aparecepage: command not found
# 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 autoassinado, 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 desativa a verificação, abrindo espaço para ataques de intermediário. Em produção, conserte a cadeia de certificados.
9-5. Ambiente de Proxy Não 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 Exercícios
Conclusão: Use httpbin.org para praticar verificação de status, POST JSON e seguir redirecionamentos.
https://httpbin.org é um ambiente seguro para testes HTTP — pode acessar à vontade.Crie um diretório de prática vazio e trabalhe dentro dele. Assim você nunca sobrescreve um arquivo que já tinha.
# Prepare um diretorio de pratica e entre nele $ mkdir -p ~/curl-practice && cd ~/curl-practice
~representa o seu diretório home, o espaço que pertence a você&&significa "execute o lado direito só se o esquerdo der certo". Duas linhas separadas fazem o mesmo
Exercício 1: Verifique o código de status HTTP e o content-type de https://httpbin.org/get.
Ver Dica 1 (Direção)
Você não precisa do corpo. Existe uma flag que busca apenas as etiquetas.
Ver Dica 2 (Nome do comando)
O comando é curl. A flag é a única letra que apareceu em "4. Inspecionar Apenas Headers".
Ver Resposta
$ curl -I https://httpbin.org/get
HTTP/2 200 date: ... content-type: application/json ...
O 200 inicial indica sucesso. content-type: application/json diz que a resposta é JSON.
Exercício 2: Envie o JSON {"hello":"world"} via POST para https://httpbin.org/post.
Ver Dica 1 (Direção)
Você precisa de três coisas: o método, a declaração "isto é JSON" e o corpo.
Ver Dica 2 (Nome do comando)
O comando é curl. As flags são as três usadas em "5-2. POST JSON".
Ver Resposta
$ curl -X POST https://httpbin.org/post \
-H "Content-Type: application/json" \
-d '{"hello":"world"}'Você verá "json": {"hello": "world"} devolvido na resposta.
Exercício 3: Siga a cadeia de redirecionamentos em https://httpbin.org/redirect/3 e busque a página final.
Ver Dica 1 (Direção)
O curl ignora o aviso de "mudou de lugar" a menos que você mande persegui-lo.
Ver Dica 2 (Nome do comando)
O comando é curl. A flag é a única letra de "3. A Armadilha #1 para Iniciantes" — a inicial de Location.
Ver Resposta
$ curl -L https://httpbin.org/redirect/3
Depois de três saltos ele chega em /get e retorna essa resposta.
11. Templates para Copiar e Colar
Conclusão: Templates de curl e wget para copiar e colar para salvar, redirecionamentos, headers e POST.
Templates de curl
# Imprimir na tela (depuracao)
curl URL
# Salvar (usando nome do arquivo da URL; sobrescreve o mesmo nome)
curl -O URL
# Salvar (nome personalizado; sobrescreve o mesmo nome)
curl -o name 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 de wget
# Download basico (acrescenta um numero se o nome existir) wget URL # Salvar com nome personalizado (sobrescreve esse nome) 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/
Retomando
Conclusão: Escolha pelo objetivo, olhe antes de baixar e use -L em sites externos.
pwd e ls antes de baixar, porque curl -O sobrescreve sem perguntar.-L quando o curl acessa um site externo. Leve esses três pontos.Resumo em Três Linhas
Conclusão: Escolha a ferramenta pelo objetivo, confira o destino e a sobrescrita, e use -L em sites externos.
- Use
curlpara APIs e headers. Usewgetquando só quer o arquivo - Rode
pwdelsantes.curl -Oecurl -osobrescrevem o mesmo nome sem perguntar - Adicione
-Lquando o curl acessar um site externo, para ele seguir o redirecionamento