Uso de proxy com o wget: comandos e exemplos

Publicado:

11 min de leitura

Acar Diveroli
Autor: Acar Diveroli
Download via proxy em uma janela de linha de comando

O wget é uma ferramenta de linha de comando, presente por padrão na maioria dos sistemas Linux e macOS, usada para baixar arquivos e buscar páginas web. É bastante usada para baixar arquivos a partir de scripts em servidores, espelhar um site ou fazer um teste simples de acesso. Neste artigo explicamos três formas de rodar o wget via proxy, a autenticação, os detalhes de HTTPS, os cuidados em downloads em massa e os erros mais comuns, com comandos de exemplo.

Todas as opções apresentadas estão documentadas no manual do GNU Wget.

Antes de começar: o wget está instalado?

Verifique a versão no terminal:

bash
wget --version

Se o comando não for encontrado, instale com sudo apt install wget no Debian e Ubuntu, ou com brew install wget via Homebrew no macOS. No Windows, o wget não vem instalado por padrão; para os mesmos trabalhos, pode-se usar o curl.exe, que já vem com o Windows 10 e versões posteriores. Já o wget do PowerShell não é o wget de verdade, é um apelido do comando Invoke-WebRequest, e não aceita as opções deste artigo.

Nos testes, usar um endereço que retorna o seu IP facilita o trabalho. Se o proxy estiver funcionando, esse endereço mostra não o seu IP, mas o do proxy:

bash
wget -qO- https://httpbin.org/ip

Aqui, -q deixa a saída silenciosa, e -O- imprime o conteúdo baixado na tela em vez de gravar em arquivo. Rode uma vez antes de configurar o proxy e anote o seu próprio IP; nas tentativas seguintes, você verá a diferença na hora.

O formato do endereço do proxy

Nos três métodos, o proxy é escrito no mesmo formato:

text
http://usuario:senha@servidor:porta
  • O esquema http:// é o protocolo da conexão estabelecida com o proxy. Ele é usado mesmo ao acessar sites HTTPS; explicamos o motivo abaixo.
  • A parte usuario:senha@ é opcional. Se você autorizou o IP do seu servidor no painel do seu proxy, pode omitir essa parte completamente.
  • A informação servidor:porta varia de acordo com o seu pacote; encontre os valores corretos no seu painel de cliente.

Método 1: por variáveis de ambiente

O wget lê as variáveis de ambiente padrão de proxy do sistema: http_proxy, https_proxy, ftp_proxy e no_proxy. Esse é o método mais rápido, e muitas outras ferramentas rodando no mesmo terminal também usam essas variáveis.

bash
export http_proxy="http://usuario:senha@pr.proxynet.io:8000"
export https_proxy="http://usuario:senha@pr.proxynet.io:8000"

wget -qO- https://httpbin.org/ip

Há três pontos a observar:

  • O valor de https_proxy também começa com http://. Essa variável define o proxy que será usado para acessar sites HTTPS; a conexão estabelecida com o próprio proxy é HTTP, e o tráfego HTTPS é tunelado dentro dela.
  • As variáveis valem apenas para aquela sessão do terminal. Se quiser que sejam permanentes, adicione-as ao ~/.bashrc ou ~/.zshrc.
  • Prefira a grafia em minúsculas. O wget lê as variáveis em minúsculas; em alguns sistemas, a versão em maiúsculas HTTP_PROXY também pode estar definida, e se as duas definições entrarem em conflito, isso pode confundir. O mais seguro é definir as duas com o mesmo valor.

Se você quer que determinados endereços não passem pelo proxy, use no_proxy:

bash
export no_proxy="localhost,127.0.0.1,.suaempresa.local"

Essa variável evita que serviços da rede interna ou servidores de desenvolvimento local passem pelo proxy. Um domínio começando com ponto abrange todos os subdomínios daquele domínio.

Método 2: na linha de comando, uso pontual

Para passar apenas um comando específico pelo proxy sem alterar as variáveis de ambiente, você pode passar as configurações do wget diretamente no comando com a opção -e (--execute):

bash
wget -e use_proxy=yes \
     -e https_proxy=http://pr.proxynet.io:8000 \
     --proxy-user=usuario \
     --proxy-password=senha \
     https://httpbin.org/ip -O -

Esse método é especialmente útil em scripts: a configuração de proxy não afeta outros comandos, e você pode passar um proxy diferente em cada chamada. Por exemplo, em um loop, se você quiser fazer cada download a partir de um ponto de saída diferente, pode ler o valor de -e https_proxy= a partir da variável do loop.

Cada linha passada com -e é uma configuração que também pode ser gravada no arquivo .wgetrc. Ou seja, cada chave que você verá no próximo método também vale aqui.

Método 3: pelo arquivo .wgetrc, de forma permanente

Se você usa o wget com proxy o tempo todo na mesma máquina, pode gravar as configurações no arquivo ~/.wgetrc, no seu diretório de usuário:

ini
use_proxy = on
http_proxy = http://pr.proxynet.io:8000
https_proxy = http://pr.proxynet.io:8000
proxy_user = usuario
proxy_password = senha

Como o arquivo contém a senha, restrinja as permissões para que só você consiga lê-lo:

bash
chmod 600 ~/.wgetrc

Se for necessária uma configuração para todo o sistema, as mesmas linhas podem ser gravadas em /etc/wgetrc; o arquivo no diretório do usuário sobrepõe os valores do arquivo do sistema.

Se você quiser desativar o proxy temporariamente enquanto esse arquivo está definido, adicione a opção --no-proxy a um único comando:

bash
wget --no-proxy https://httpbin.org/ip -O -

Qual método escolher?

SituaçãoMétodo recomendado
Teste rápido no terminalVariável de ambiente
Em script, proxy diferente a cada chamadaLinha de comando com -e
Uso contínuo de proxy no servidor.wgetrc
Manter determinados endereços fora do proxyno_proxy
Download agendado via cron.wgetrc (o cron não propaga variáveis de ambiente)
Dentro de um container DockerVariável de ambiente (via ENV)

Se os três métodos estiverem definidos ao mesmo tempo, a ordem de prioridade é: as opções de linha de comando sobrepõem as variáveis de ambiente, e as variáveis de ambiente sobrepõem o arquivo .wgetrc.

Como o proxy funciona em sites HTTPS?

Ao acessar um endereço HTTPS via proxy, o wget primeiro envia ao proxy uma requisição CONNECT destino:443. O proxy abre uma conexão TCP com o destino e, a partir daí, só transporta os bytes criptografados. Ou seja, o proxy não consegue ver o conteúdo do site; ele só sabe a qual domínio a conexão foi feita.

A consequência prática disso é: mesmo que o endereço do proxy comece com http://, você pode acessar sites HTTPS com segurança. A validação do certificado é feita entre a sua máquina e o site de destino; o proxy não interfere nessa validação. Comparamos esse comportamento do proxy e a diferença em relação ao SOCKS no artigo Diferença entre SOCKS e HTTP proxy.

Usando junto com opções comuns

A configuração de proxy sozinha raramente é suficiente; em trabalhos reais, você precisa de mais algumas opções. O exemplo abaixo baixa um arquivo via proxy com configurações de nova tentativa e tempo limite:

bash
wget --timeout=30 --tries=3 --waitretry=5 \
     --user-agent="Mozilla/5.0 (X11; Linux x86_64)" \
     -O relatorio.pdf https://example.com/relatorio.pdf
  • --timeout limita o tempo de espera de cada operação de rede.
  • --tries define quantas vezes tentar de novo um download que falhou; --waitretry coloca uma espera entre as tentativas.
  • --user-agent muda a identidade do navegador. A identidade padrão do wget é bloqueada diretamente em alguns sites; usar um valor que se identifique é mais transparente e gera menos problemas.
  • -O nomeia o arquivo de saída; se você adicionar -c, um download interrompido continua de onde parou.

Se a página exige cookies, as opções --load-cookies e --save-cookies mantêm a sessão em um arquivo; assim é possível manter uma sessão já autenticada junto com o proxy.

O wget suporta proxy SOCKS?

O GNU wget não tem suporte nativo a SOCKS; todos os métodos acima são para proxy HTTP e HTTPS. Se você precisa de SOCKS5, tem duas opções:

  • Usar o cURL. O cURL suporta diretamente os esquemas socks5:// e socks5h:// e faz praticamente tudo o que o wget faz. Mais detalhes no artigo Como usar proxy com o cURL?.
  • Usar uma ferramenta de redirecionamento. No Linux, ferramentas como o proxychains conseguem redirecionar para um proxy SOCKS as conexões de programas sem suporte nativo a SOCKS. No Windows, o Proxifier faz o mesmo trabalho.

Para pacotes que funcionam diretamente com o wget, veja a nossa página de Proxies HTTPS.

Erros comuns e suas soluções

"407 Proxy Authentication Required"

As credenciais do proxy estão faltando ou incorretas. Verifique o usuário e a senha. Se a senha tiver caracteres especiais como @, : ou #, codifique-os no endereço com codificação percentual (%40 para @) ou use as opções --proxy-user e --proxy-password, que não exigem codificação.

O comando não está usando o proxy

  • Confirme que você definiu a variável com export; apenas escrever http_proxy=... não a propaga para os subprocessos.
  • Se o endereço for HTTPS, é a variável https_proxy, não http_proxy, que precisa estar definida.
  • Verifique se não há uma linha use_proxy = off no .wgetrc.
  • Se você está rodando sudo wget, o sudo pode não propagar suas variáveis de ambiente por padrão; propague com sudo -E ou grave a configuração em /etc/wgetrc.
  • O endereço de destino pode estar coincidindo com um domínio da lista no_proxy.

"Unable to establish SSL connection"

Primeiro, verifique se o endereço de destino abre sem proxy. Se o problema for de certificado, a opção --no-check-certificate pula a validação; mas essa opção enfraquece a segurança da conexão e deve ser usada só para teste. Lembre-se de que o proxy não interfere na validação de certificado: esse erro costuma vir de um repositório de certificados raiz desatualizado no sistema ou da configuração do site de destino.

A conexão está expirando

Verifique de novo o endereço e a porta do proxy. Certifique-se de que o firewall permite tráfego para a porta do proxy. Em downloads longos, definir explicitamente o tempo limite e o número de tentativas evita que os scripts travem:

bash
wget --timeout=30 --tries=3 https://httpbin.org/ip -O -

"ERROR 403: Forbidden"

O site de destino está recusando a requisição. O motivo pode não ser o proxy; o valor padrão de User-Agent do wget é bloqueado diretamente em alguns sites. Informe um valor que se identifique com --user-agent. Se o problema persistir, o site de destino pode estar reagindo ao tipo de IP do proxy; explicamos por que endereços de datacenter são recusados com mais frequência no artigo Diferença entre proxy residencial e datacenter.

Cuidados em downloads em massa

A opção -r (download recursivo) do wget consegue baixar um site inteiro com um único comando. Esse poder pode gerar uma carga séria no servidor de destino. Em downloads em massa, as opções a seguir são boas tanto para você quanto para o destino:

bash
wget -r -l 2 --wait=2 --random-wait --limit-rate=500k \
     --no-parent -A pdf https://example.com/documentos/
  • -l 2 limita a profundidade a dois níveis; profundidade ilimitada baixa o site inteiro.
  • --wait=2 coloca dois segundos entre as requisições; --random-wait torna esse intervalo aleatório.
  • --limit-rate=500k limita a velocidade de download.
  • --no-parent impede subir para diretórios pai; -A pdf pega apenas as extensões indicadas.

Por padrão, o wget respeita as regras do robots.txt; não desative esse comportamento. Explicamos quais dados podem ser coletados sob quais condições no artigo A extração de dados é legal?.

Em projetos que exigem muitas requisições, distribuir os endereços com o Proxies rotativos, em vez de concentrar o tráfego em um único IP, reduz o risco de bloqueio e gera uma carga mais equilibrada no site de destino. Para necessidades mais amplas, veja nossas soluções de extração de dados.

Perguntas frequentes

wget ou cURL?

Para download de arquivos, espelhamento e captura recursiva, o wget é mais prático; para requisições de API, métodos HTTP personalizados e proxy SOCKS, o cURL é mais versátil. Os dois leem o proxy HTTP das mesmas variáveis de ambiente, então uma configuração definida uma vez funciona nas duas ferramentas.

A configuração de proxy afeta outros programas?

O proxy definido por variável de ambiente afeta todo programa iniciado no mesmo shell que lê essas variáveis (como cURL, pip, git). Os métodos .wgetrc e -e afetam apenas o wget.

Posso usar proxy sem salvar minha senha?

Sim. Se você autorizar o endereço IP do seu servidor no painel do seu provedor de proxy, não precisa de usuário e senha; o endereço é escrito apenas no formato http://servidor:porta. Para servidores com IP fixo, esse é o método mais limpo.

Posso obter um IP diferente a cada requisição com o wget?

O wget, por si só, não faz rotação. Existem dois caminhos: usar um proxy rotativo (um único endereço, um IP de saída diferente a cada conexão) ou, em um script, passar um proxy diferente a cada chamada com -e https_proxy=.

Posso baixar via FTP usando proxy?

Se a variável ftp_proxy estiver definida, o wget busca endereços FTP através de um proxy HTTP; o proxy precisa suportar esse uso. Hoje em dia, com a queda no uso de FTP, a maioria dos pacotes de proxy foca em HTTP e HTTPS.

Em resumo

Existem três formas de usar o wget com proxy: variáveis de ambiente para testes rápidos, a opção -e para uso pontual em scripts e o arquivo .wgetrc para uso contínuo. Não esqueça de definir https_proxy para endereços HTTPS, guardar as credenciais com segurança, limitar a velocidade em downloads em massa e migrar para o cURL quando precisar de SOCKS.