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?".
- Baixar arquivos com
curle comwget, 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
digeresolvectl, e seguir o caminho dos pacotes comtracepath.
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ódigo | Significado | Exemplo do dia a dia |
|---|---|---|
200 | OK, deu certo | A página abriu |
301 / 302 | Mudou de endereço (redirecionamento) | http:// mandando para https:// |
403 | Proibido | Sem permissão para ver |
404 | Não encontrado | Link quebrado |
500 / 502 / 503 | Erro no servidor | O 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ção | Nome do arquivo salvo | Exemplo |
|---|---|---|
-o nome | O nome que você escolher | curl -o logo.png https://site/img/a1b2.png |
-O | O mesmo nome que está no endereço | curl -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.
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 curl | Significado |
|---|---|
0 | Sucesso |
6 | Não conseguiu resolver o nome (problema de DNS ou nome errado) |
7 | Não conseguiu conectar (servidor desligado ou porta fechada) |
22 | O servidor respondeu com erro HTTP (só com -f) |
28 | Tempo esgotado |
60 | Certificado 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.
GETbusca (é o padrão);POSTenvia;PUTatualiza;DELETEapaga. - -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ção | Faz | Exemplo |
|---|---|---|
-O nome | Salva com outro nome (-O - mostra na tela) | wget -O logo.png https://… |
-c | Continua um download interrompido | wget -c https://…/arquivo.iso |
-q | Silencioso | wget -q https://… |
-P pasta | Salva dentro da pasta indicada | wget -P ~/Downloads https://… |
-i lista.txt | Baixa todos os endereços de um arquivo | wget -i links.txt |
--spider | Só testa se o endereço existe, sem baixar | wget --spider https://… |
Formas diferentes de baixar um arquivo
| Forma | Comando | Melhor quando… |
|---|---|---|
| wget | wget URL | Você só quer o arquivo salvo, sem pensar em opções |
| wget com retomada | wget -c URL | O arquivo é grande ou a conexão é instável |
| curl com nome original | curl -LO URL | Você já está usando o curl, ou ele está instalado e o wget não |
| curl com outro nome | curl -L -o nome URL | O nome no endereço é feio ou genérico |
| Navegador | Clique 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 @:
| Tipo | Guarda | Exemplo |
|---|---|---|
A | Endereço IPv4 (o padrão) | dig +short ubuntu.com A |
AAAA | Endereço IPv6 | dig +short ubuntu.com AAAA |
MX | Servidores de e-mail do domínio | dig +short gmail.com MX |
NS | Servidores de DNS responsáveis pelo domínio | dig +short ubuntu.com NS |
TXT | Textos de verificação, regras antispam | dig +short ubuntu.com TXT |
CNAME | Apelido: um nome que aponta para outro | dig +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
| Comando | Característica |
|---|---|
dig +short nome | O mais completo e o mais usado para diagnóstico |
resolvectl query nome | Pergunta do jeito que o próprio Ubuntu pergunta (inclui o cache local) |
nslookup nome | Antigo, também existe no Windows |
getent hosts nome | Usa 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 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 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).
$ 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 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.
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ção | Descrição |
|---|---|
-I | Só cabeçalhos |
-L | Segue redirecionamentos |
-o nome / -O | Salva com o nome escolhido / com o nome original |
-s / -S | Silencioso / mostra erros mesmo com -s |
-f | Devolve erro (código 22) se o servidor responder com erro |
-v | Mostra a conversa inteira, para depurar |
-X MÉTODO | GET, POST, PUT, DELETE… |
-H "Nome: valor" | Envia um cabeçalho |
-d dados / --json dados | Envia dados / envia JSON |
-u usuario:senha | Autenticação |
-w formato | Mostra informações no fim, como %{http_code} |
-C - | Continua um download interrompido |
-4 / -6 | Força IPv4 / IPv6 |
dig
| Forma | Descrição |
|---|---|
dig nome | Consulta completa |
dig +short nome | Só a resposta |
dig nome TIPO | A, AAAA, MX, NS, TXT, CNAME |
dig nome @servidor | Pergunta a um DNS específico |
dig -x IP | Consulta 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:
2. Download com nome original e redirecionamento
Complete para baixar o arquivo seguindo redirecionamentos e mantendo o nome original:
3. Retomar o download
A conexão caiu no meio de um download grande. Complete para continuar de onde parou:
4. Só o IP
Complete para mostrar só os IPs de ubuntu.com, sem detalhes:
5. curl https://site.com mostra curl: (7) Failed to connect. O que isso indica?
Resumo
curl URLmostra a resposta;-Imostra só os cabeçalhos;-Lsegue redirecionamentos.- Baixar:
curl -LO URLouwget URL; retomar:wget -c URL. - Em scripts, use
curl -fpara o código de saída refletir erros HTTP. dig +short nomemostra o IP;@1.1.1.1pergunta a outro DNS;tracepathmostra o caminho.- Erro 6 = DNS; erro 7 = conexão recusada; 404 = endereço errado no servidor.