Ubuntu curl, wget, dig

O curl e o wget conversam com sites pelo terminal: baixam arquivos, testam se um endereço está no ar e enviam dados para APIs. O dig pergunta ao DNS qual é o IP de um nome. Juntos, eles respondem a pergunta "o problema é a rede, o DNS ou o site?".

Você vai aprender
  • Baixar arquivos com curl e com wget, e quando preferir cada um.
  • Ver só os cabeçalhos de uma resposta e entender os códigos HTTP (200, 301, 404…).
  • Enviar dados para uma API com curl.
  • Consultar o DNS com dig e resolvectl, e seguir o caminho dos pacotes com tracepath.

Como a web conversa: pedido e resposta

Quando você abre um site, o navegador envia um pedido (request) ao servidor, e o servidor devolve uma resposta (response). Essa conversa segue o protocolo HTTP, ou HTTPS quando é criptografada.

A resposta tem duas partes: os cabeçalhos (informações sobre a resposta, como o tipo e o tamanho) e o corpo (a página, a imagem ou o arquivo). O primeiro cabeçalho traz um código de status:

CódigoSignificadoExemplo do dia a dia
200OK, deu certoA página abriu
301 / 302Mudou de endereço (redirecionamento)http:// mandando para https://
403ProibidoSem permissão para ver
404Não encontradoLink quebrado
500 / 502 / 503Erro no servidorO site está com problema, não você

curl: ver o conteúdo de um endereço

curl vem de Client URL, "cliente de URL". Sem opções, ele busca o endereço e mostra o corpo da resposta na tela:

curl
O programa.
https://api.github.com/zen
O endereço (URL) a buscar.
$ curl https://api.github.com/zen
Keep it logically awesome.                   « o corpo da resposta: um texto curto

Se o endereço for uma página comum, a tela se enche de HTML. Por isso, o curl quase sempre vem acompanhado de opções.

Só os cabeçalhos: -I

Para saber se um site está no ar, você não precisa da página inteira. -I (i maiúsculo, de head) pede só os cabeçalhos:

curl
O programa.
-I
Busca só os cabeçalhos da resposta.
https://ubuntu.com
O site.
$ curl -I https://ubuntu.com
HTTP/2 200                                   « 200: o site respondeu normalmente
server: nginx/1.14.0 (Ubuntu)                « o programa do servidor
date: Thu, 15 Oct 2026 13:30:00 GMT
content-type: text/html; charset=utf-8       « o tipo do conteúdo: uma página HTML
content-length: 209845                       « o tamanho, em bytes
referrer-policy: strict-origin-when-cross-origin

A resposta real tem mais linhas; mostramos as principais.

Seguir redirecionamentos: -L

Muitos endereços mandam você para outro lugar. Sem -L (de location), o curl para no primeiro passo e mostra só o aviso de mudança:

$ curl -I http://ubuntu.com
HTTP/1.1 301 Moved Permanently               « mudou de endereço…
location: https://ubuntu.com/                « …para este
$ curl -sIL http://ubuntu.com | grep -i -E "^HTTP|^location"
HTTP/1.1 301 Moved Permanently
location: https://ubuntu.com/
HTTP/2 200                                   « com -L, ele seguiu e chegou ao destino

Aqui também usamos -s (silent, "silencioso"), que esconde a barra de progresso. O | grep filtra só as linhas que interessam.


Baixar arquivos com curl: -o e -O

Para salvar em vez de mostrar, há duas opções, e a diferença é só a letra maiúscula:

OpçãoNome do arquivo salvoExemplo
-o nomeO nome que você escolhercurl -o logo.png https://site/img/a1b2.png
-OO mesmo nome que está no endereçocurl -O https://site/manual.pdf salva manual.pdf
curl
O programa.
-L
Segue redirecionamentos (links de download costumam redirecionar).
-O
Salva com o nome original do arquivo.
https://releases.ubuntu.com/26.04/SHA256SUMS
O arquivo a baixar.
$ curl -LO https://releases.ubuntu.com/26.04/SHA256SUMS
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   202  100   202    0     0    870      0 --:--:-- --:--:-- --:--:--   870
$ ls -l SHA256SUMS
-rw-rw-r-- 1 ana ana 202 Oct 15 10:30 SHA256SUMS

A tabela de progresso mostra o tamanho total, quanto já foi recebido e a velocidade. Os números são ilustrativos.

Cuidado com curl … | bash

Alguns sites mandam instalar programas com curl -fsSL https://site/install.sh | bash. Isso baixa um script e executa na hora, sem você ver o que ele faz. Prefira baixar primeiro (curl -fsSLO …), ler com less install.sh e só depois rodar.


O que o curl devolve

Por padrão, o curl considera "sucesso" qualquer resposta, até um 404. Para scripts, isso engana. A opção -f (fail, "falhar") faz ele devolver erro quando o servidor responde com erro:

$ curl -s https://ubuntu.com/pagina-que-nao-existe > /dev/null; echo $?
0                                            « "deu certo", apesar do 404!
$ curl -sf https://ubuntu.com/pagina-que-nao-existe > /dev/null; echo $?
22                                           « com -f: erro 22 = o servidor respondeu com erro HTTP

E para ver só o código HTTP, use -w (write-out) com -o /dev/null, que descarta o corpo:

$ curl -s -o /dev/null -w "%{http_code}\n" https://ubuntu.com
200
$ curl -s -o /dev/null -w "%{http_code} em %{time_total}s\n" https://ubuntu.com
200 em 0.411899s
Código do curlSignificado
0Sucesso
6Não conseguiu resolver o nome (problema de DNS ou nome errado)
7Não conseguiu conectar (servidor desligado ou porta fechada)
22O servidor respondeu com erro HTTP (só com -f)
28Tempo esgotado
60Certificado HTTPS inválido

Enviar dados para uma API

APIs são endereços feitos para programas, não para pessoas. Com o curl você escolhe o método do pedido, envia cabeçalhos e dados:

curl
O programa.
-X POST
O método. GET busca (é o padrão); POST envia; PUT atualiza; DELETE apaga.
-H "Content-Type: application/json"
Um cabeçalho: avisa que os dados estão em JSON.
-d '{"nome":"ana"}'
Os dados enviados no corpo do pedido.
https://httpbin.org/post
Um serviço de teste que devolve o que recebeu.
$ curl -s -X POST -H "Content-Type: application/json" -d '{"nome":"ana"}' https://httpbin.org/post
{
  "data": "{\"nome\":\"ana\"}",
  "headers": {
    "Content-Type": "application/json",
    …
  },
  "json": {
    "nome": "ana"                            « o servidor recebeu o que enviamos
  },
  …
}

Formas mais curtas: quando há -d, o método já vira POST sozinho, então o -X POST pode sair. E a opção --json junta o cabeçalho e os dados num só:

$ curl -s --json '{"nome":"ana"}' https://httpbin.org/post

Login com usuário e senha: -u

$ curl -u ana:senha123 https://exemplo.com/area-restrita

Se você omitir a senha (-u ana), o curl pergunta, e ela não fica no histórico do terminal.


wget: o especialista em downloads

wget vem de web get, "pegar da web". Diferente do curl, o padrão dele é salvar em arquivo, e ele sabe retomar downloads interrompidos.

wget
O programa.
https://releases.ubuntu.com/26.04/SHA256SUMS
O arquivo: é salvo com o mesmo nome, na pasta atual.
$ wget https://releases.ubuntu.com/26.04/SHA256SUMS
--2026-10-15 10:30:00--  https://releases.ubuntu.com/26.04/SHA256SUMS
Resolvendo releases.ubuntu.com (releases.ubuntu.com)... 185.125.190.37, 185.125.190.40
Conectando-se a releases.ubuntu.com (releases.ubuntu.com)|185.125.190.37|:443... conectado.
A requisição HTTP foi enviada, aguardando resposta... 200 OK
Tamanho: 202 [text/plain]
Salvando em: “SHA256SUMS”

SHA256SUMS          100%[===================>]     202  --.-KB/s    em 0s

2026-10-15 10:30:01 (9,63 MB/s) - “SHA256SUMS” salvo [202/202]

O wget conta cada etapa: resolveu o nome (DNS), conectou, recebeu a resposta 200 e salvou. Se algo falhar, a última linha mostra onde parou.

Retomar um download: -c

Baixando um arquivo grande, a conexão caiu? Rode o mesmo comando com -c (continue) e ele continua de onde parou, em vez de recomeçar:

$ wget -c https://releases.ubuntu.com/26.04/ubuntu-26.04-desktop-amd64.iso

Outras opções do wget

OpçãoFazExemplo
-O nomeSalva com outro nome (-O - mostra na tela)wget -O logo.png https://…
-cContinua um download interrompidowget -c https://…/arquivo.iso
-qSilenciosowget -q https://…
-P pastaSalva dentro da pasta indicadawget -P ~/Downloads https://…
-i lista.txtBaixa todos os endereços de um arquivowget -i links.txt
--spiderSó testa se o endereço existe, sem baixarwget --spider https://…

Formas diferentes de baixar um arquivo

FormaComandoMelhor quando…
wgetwget URLVocê só quer o arquivo salvo, sem pensar em opções
wget com retomadawget -c URLO arquivo é grande ou a conexão é instável
curl com nome originalcurl -LO URLVocê já está usando o curl, ou ele está instalado e o wget não
curl com outro nomecurl -L -o nome URLO nome no endereço é feio ou genérico
NavegadorClique no linkÉ um arquivo só e você está no desktop

Para conversar com APIs, testar cabeçalhos e enviar dados, o curl é a ferramenta certa. Para baixar muitos arquivos ou retomar downloads, o wget é mais prático.


dig: perguntar ao DNS

Quando um site não abre, a primeira suspeita é o DNS. O dig pergunta diretamente qual IP corresponde a um nome.

$ dig ubuntu.com
; <<>> DiG 9.20.24-1ubuntu0.3-Ubuntu <<>> ubuntu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3694      « NOERROR: o nome existe
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;ubuntu.com.                    IN      A                         « a pergunta: qual o IPv4 (A)?

;; ANSWER SECTION:
ubuntu.com.             7       IN      A       185.125.190.20    « as respostas
ubuntu.com.             7       IN      A       185.125.190.21
ubuntu.com.             7       IN      A       91.189.91.44

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)                       « quem respondeu: o DNS local do Ubuntu
;; WHEN: Thu Oct 15 10:30:00 -03 2026
;; MSG SIZE  rcvd: 151

O número 7 na resposta é o TTL: por quantos segundos essa resposta pode ficar guardada antes de perguntar de novo. Para o dia a dia, quase sempre basta a forma curta:

$ dig +short ubuntu.com
185.125.190.20
185.125.190.21
91.189.91.44

Tipos de registro e servidor específico

O DNS guarda mais do que IPv4. Escolha o tipo depois do nome, e pergunte a um servidor específico com @:

TipoGuardaExemplo
AEndereço IPv4 (o padrão)dig +short ubuntu.com A
AAAAEndereço IPv6dig +short ubuntu.com AAAA
MXServidores de e-mail do domíniodig +short gmail.com MX
NSServidores de DNS responsáveis pelo domíniodig +short ubuntu.com NS
TXTTextos de verificação, regras antispamdig +short ubuntu.com TXT
CNAMEApelido: um nome que aponta para outrodig +short www.exemplo.com CNAME
$ dig +short ubuntu.com @1.1.1.1              « pergunta direto à Cloudflare, sem passar pelo roteador
185.125.190.20
185.125.190.21
91.189.91.44

Se o DNS do roteador falha mas o @1.1.1.1 responde, o problema é o DNS configurado na sua rede.

Outras formas de consultar o DNS

ComandoCaracterística
dig +short nomeO mais completo e o mais usado para diagnóstico
resolvectl query nomePergunta do jeito que o próprio Ubuntu pergunta (inclui o cache local)
nslookup nomeAntigo, também existe no Windows
getent hosts nomeUsa as mesmas regras dos programas, incluindo o /etc/hosts
$ resolvectl query ubuntu.com
ubuntu.com: 185.125.190.20                     -- link: wlp2s0
            185.125.190.21                     -- link: wlp2s0
            2620:2d:4000:1::26                 -- link: wlp2s0

-- Information acquired via protocol DNS in 21.4ms.
-- Data is authenticated: no; Data was acquired via local or encrypted transport: no
-- Data from: network

tracepath e mtr: o caminho até o destino

Entre você e um site existem vários roteadores. O tracepath mostra cada "salto" do caminho e quanto tempo cada um leva. Se a conexão trava num salto, você sabe se é o seu roteador, o provedor ou o destino.

$ tracepath -n 8.8.8.8
 1?: [LOCALHOST]                      pmtu 1500
 1:  192.168.0.1                                           3.194ms      « o seu roteador
 2:  10.15.255.250                                        12.805ms      « o provedor
 3:  138.255.244.85                                       14.456ms
 4:  no reply                                                           « um roteador que não responde: normal
 …

-n mostra só os IPs, sem tentar descobrir nomes, o que é mais rápido. O mtr faz o mesmo de forma contínua, atualizando a tela: rode mtr 8.8.8.8 e saia com q.


Quando não funciona

curl: (6) Could not resolve host
$ curl https://ubunto.com
curl: (6) Could not resolve host: ubunto.com

O que aconteceu: o DNS não achou o nome. Aqui foi erro de digitação, mas também acontece quando o DNS está fora.

Como confirmar: dig +short ubunto.com não devolve nada. Teste um nome conhecido (dig +short ubuntu.com); se ele também falhar, o problema é o DNS. Veja o roteiro em Conceitos de Rede.

curl: (7) Failed to connect
$ curl http://192.168.0.50:8080
curl: (7) Failed to connect to 192.168.0.50 port 8080 after 2 ms: Could not connect to server

O que aconteceu: o nome foi resolvido e a máquina foi encontrada, mas nada respondeu nessa porta. O programa está parado, escuta em outra porta, ou um firewall bloqueia.

Como confirmar: na máquina de destino, rode sudo ss -tlpn e veja se a porta aparece (veja ip, ping, ss).

O arquivo baixado tem só alguns bytes
$ curl -O https://exemplo.com/download/programa.deb
$ ls -l programa.deb
-rw-rw-r-- 1 ana ana 162 Oct 15 10:30 programa.deb        « 162 bytes: não é um programa

O que aconteceu: o link redirecionava para outro endereço, e o curl salvou só a página de aviso do redirecionamento.

Como resolver: acrescente -L: curl -LO URL. Use também -f para o curl reclamar quando a resposta for um erro.

wget: ERRO 404
$ wget https://ubuntu.com/arquivo-que-nao-existe
…
A requisição HTTP foi enviada, aguardando resposta... 404 Not Found
2026-10-15 10:30:42 ERRO 404: Not Found.

O que aconteceu: o servidor está no ar, mas esse endereço não existe. Confira o link: maiúsculas, versão no nome do arquivo, barra no final.

curl: (60) SSL certificate problem

O que aconteceu: o certificado HTTPS do site é inválido, vencido ou de um servidor de teste. Também acontece quando a data do computador está errada.

Como resolver: confira a data com date. Só use -k (ignorar o certificado) em servidores seus, de teste; nunca em sites de banco ou de login.


Referência de opções

curl

OpçãoDescrição
-ISó cabeçalhos
-LSegue redirecionamentos
-o nome / -OSalva com o nome escolhido / com o nome original
-s / -SSilencioso / mostra erros mesmo com -s
-fDevolve erro (código 22) se o servidor responder com erro
-vMostra a conversa inteira, para depurar
-X MÉTODOGET, POST, PUT, DELETE…
-H "Nome: valor"Envia um cabeçalho
-d dados / --json dadosEnvia dados / envia JSON
-u usuario:senhaAutenticação
-w formatoMostra informações no fim, como %{http_code}
-C -Continua um download interrompido
-4 / -6Força IPv4 / IPv6

dig

FormaDescrição
dig nomeConsulta completa
dig +short nomeSó a resposta
dig nome TIPOA, AAAA, MX, NS, TXT, CNAME
dig nome @servidorPergunta a um DNS específico
dig -x IPConsulta reversa: o nome de um IP

Exercícios

1. O site está no ar?

Complete para ver só os cabeçalhos da resposta de https://ubuntu.com:

curl https://ubuntu.com

2. Download com nome original e redirecionamento

Complete para baixar o arquivo seguindo redirecionamentos e mantendo o nome original:

curl https://exemplo.com/download/app.tar.gz

3. Retomar o download

A conexão caiu no meio de um download grande. Complete para continuar de onde parou:

wget https://releases.ubuntu.com/26.04/ubuntu-26.04-desktop-amd64.iso

4. Só o IP

Complete para mostrar só os IPs de ubuntu.com, sem detalhes:

dig ubuntu.com

5. curl https://site.com mostra curl: (7) Failed to connect. O que isso indica?


Resumo

  • curl URL mostra a resposta; -I mostra só os cabeçalhos; -L segue redirecionamentos.
  • Baixar: curl -LO URL ou wget URL; retomar: wget -c URL.
  • Em scripts, use curl -f para o código de saída refletir erros HTTP.
  • dig +short nome mostra o IP; @1.1.1.1 pergunta a outro DNS; tracepath mostra o caminho.
  • Erro 6 = DNS; erro 7 = conexão recusada; 404 = endereço errado no servidor.