Domine o wget: 10+ comandos essenciais para solução de problemas web

O utilitário `wget` é uma ferramenta indispensável para administradores de sistemas, especialmente durante a resolução de problemas relacionados à web. Sua versatilidade e funcionalidades o tornam um aliado poderoso em diversas situações.

O que é o `wget`?

O `wget` é um utilitário de linha de comando, amplamente utilizado em sistemas Unix/Linux, que permite a recuperação de conteúdo da web. Sendo um software livre, oferece uma maneira não interativa de baixar arquivos da internet. O `wget` suporta protocolos como HTTPS, HTTP e FTP, e ainda permite o uso de proxies HTTP.

Como o `wget` auxilia na resolução de problemas?

A utilização do `wget` na resolução de problemas é vasta.

Administradores de sistema, frequentemente trabalhando em terminais, podem necessitar verificar a conectividade de aplicações web sem visualizar a página completa. O `wget` também é útil para verificar sites de intranet ou baixar páginas específicas para análise de conteúdo.

Uma característica fundamental do `wget` é sua não interatividade, permitindo sua execução em segundo plano, mesmo quando desconectado do sistema. Isso é crucial em situações onde se precisa baixar arquivos da web enquanto se está desconectado. O `wget` executa as tarefas designadas em segundo plano, sem necessidade de interação.

Além disso, o `wget` pode ser utilizado para baixar um site completo para visualização offline. Ele segue os links em páginas XHTML e HTML, baixando-as recursivamente, criando uma versão local do site. Esta funcionalidade é especialmente útil para ter acesso offline a páginas e sites importantes.

Vejamos alguns exemplos práticos. A sintaxe do `wget` é simples:

wget [opções] [URL]

Download de uma página da web

Para baixar uma página, basta fornecer a URL como argumento. Por exemplo, para baixar a página inicial do github.com:

wget github.com

Se a conexão estiver estabelecida, o `wget` baixará a página inicial e exibirá uma saída semelhante à seguinte:

URL transformada para HTTPS devido a uma política HSTS
--2020-02-23 10:45:52--  https://github.com/
Resolvendo github.com (github.com)... 140.82.118.3
Conectando a github.com (github.com)|140.82.118.3|:443... conectado.
Requisição HTTP enviada, aguardando resposta... 200 OK
Comprimento: não especificado [text/html]
Salvando em: ‘index.html’

index.html                                       [ <=>                                                                                        ] 131,96K  --.-KB/s    em 0,04s   

2020-02-23 10:45:52 (2,89 MB/s) - ‘index.html’ salvo [135126]

Download de múltiplos arquivos

O `wget` também permite o download de vários arquivos simultaneamente, o que é útil para automatizar downloads via scripts. Para baixar as versões Python 3.8.1 e 3.5.1, por exemplo:

wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz

A sintaxe é simples: basta separar as URLs por espaços:

wget URL1 URL2 URL3

Limitar a velocidade de download

É possível controlar a velocidade de download com a opção `–limit-rate`, o que é útil para verificar o tempo de download em diferentes larguras de banda. Veja o exemplo com o arquivo do Nodejs:

--2020-02-23 10:59:58--  https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
Resolvendo nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ...
Conectando a nodejs.org (nodejs.org)|104.20.23.46|:443... conectado.
Requisição HTTP enviada, aguardando resposta... 200 OK
Comprimento: 14591852 (14M) [application/x-xz]
Salvando em: ‘node-v12.16.1-linux-x64.tar.xz’

node-v12.16.1-linux-x64.tar.xz               100%[===========================================================================================>]  13,92M  --.-KB/s    em 0,05s   

2020-02-23 10:59:58 (272 MB/s) - ‘node-v12.16.1-linux-x64.tar.xz’ salvo [14591852/14591852]

O download de 13,92 MB levou 0,05 segundos. Agora, vamos limitar a velocidade para 500 KB/s:

--2020-02-23 11:00:18--  https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
Resolvendo nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ...
Conectando a nodejs.org (nodejs.org)|104.20.23.46|:443... conectado.
Requisição HTTP enviada, aguardando resposta... 200 OK
Comprimento: 14591852 (14M) [application/x-xz]
Salvando em: ‘node-v12.16.1-linux-x64.tar.xz.1’

node-v12.16.1-linux-x64.tar.xz.1             100%[===========================================================================================>]  13,92M   501KB/s    em 28s     

2020-02-23 11:00:46 (500 KB/s) - ‘node-v12.16.1-linux-x64.tar.xz.1’ salvo [14591852/14591852]

A redução da velocidade levou o download a 28 segundos. Isso permite simular problemas de lentidão relatados por usuários com pouca largura de banda.

Download em segundo plano

Para downloads demorados, é possível usar o argumento `-b` para executar o `wget` em segundo plano. Desta forma, não é preciso manter o terminal aberto.

wget -b https://slack.com
Continuando em segundo plano, pid 25430.
Saída será escrita em ‘wget-log.1’.

Ignorar erros de certificado

Em situações onde é preciso acessar aplicações web de intranet com certificados inválidos, o `wget` lança um erro. No entanto, é possível ignorar a validação com a opção `–no-check-certificate`.

wget https://expired.badssl.com/
--2020-02-23 11:24:59--  https://expired.badssl.com/
Resolvendo expired.badssl.com (expired.badssl.com)... 104.154.89.105
Conectando a expired.badssl.com (expired.badssl.com)|104.154.89.105|:443... conectado.
ERRO: não é possível verificar o certificado de expired.badssl.com, emitido por ‘CN=COMODO RSA Domain Validation Secure Server CA,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB’:
  O certificado emitido expirou.
Para conectar-se a expired.badssl.com de forma insegura, use `--no-check-certificate'.

O exemplo acima mostra o erro para um certificado expirado. Veja como ignorar a validação:

wget https://untrusted-root.badssl.com/ --no-check-certificate
--2020-02-23 11:33:45--  https://untrusted-root.badssl.com/
Resolvendo untrusted-root.badssl.com (untrusted-root.badssl.com)... 104.154.89.105
Conectando a untrusted-root.badssl.com (untrusted-root.badssl.com)|104.154.89.105|:443... conectado.
AVISO: não é possível verificar o certificado de untrusted-root.badssl.com, emitido por ‘CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US’:
  Certificado autoassinado encontrado.
Requisição HTTP enviada, aguardando resposta... 200 OK
Comprimento: 600 [text/html]
Salvando em: ‘index.html.6’

index.html.6                                 100%[===========================================================================================>]     600  --.-KB/s    em 0s      

2020-02-23 11:33:45 (122 MB/s) - ‘index.html.6’ salvo [600/600]

O `wget` também permite exibir o cabeçalho de resposta HTTP de um site usando a opção `-S`. Veja o exemplo com o site Coursera:

wget https://www.coursera.org -S
--2020-02-23 11:47:01--  https://www.coursera.org/
Resolvendo www.coursera.org (www.coursera.org)... 13.224.241.48, 13.224.241.124, 13.224.241.82, ...
Conectando a www.coursera.org (www.coursera.org)|13.224.241.48|:443... conectado.
Requisição HTTP enviada, aguardando resposta... 
  HTTP/1.1 200 OK
  Content-Type: text/html
  Content-Length: 511551
  Connection: keep-alive
  Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0
  Date: Sun, 23 Feb 2020 11:47:01 GMT
  etag: W/"7156d-WcZHnHFl4b4aDOL4ZSrXP0iBX3o"
  Server: envoy
  Set-Cookie: CSRF3-Token=1583322421.s1b4QL6OXSUGHnRI; Max-Age=864000; Expires=Wed, 04 Mar 2020 11:47:02 GMT; Path=/; Domain=.coursera.org
  Set-Cookie: __204u=9205355775-1582458421174; Max-Age=31536000; Expires=Mon, 22 Feb 2021 11:47:02 GMT; Path=/; Domain=.coursera.org
  Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
  X-Content-Type-Options: nosniff
  x-coursera-render-mode: html
  x-coursera-render-version: v2
  X-Coursera-Request-Id: NCnPPlYyEeqfcxIHPk5Gqw
  X-Coursera-Trace-Id-Hex: a5ef7028d77ae8f8
  x-envoy-upstream-service-time: 1090
  X-Frame-Options: SAMEORIGIN
  x-powered-by: Express
  X-XSS-Protection: 1; mode=block
  X-Cache: Miss from cloudfront
  Via: 1.1 884d101a3faeefd4fb32a5d2a8a076b7.cloudfront.net (CloudFront)
  X-Amz-Cf-Pop: LHR62-C3
  X-Amz-Cf-Id: vqvX6ZUQgtZAde62t7qjafIAqHXQ8BLAv8UhkPHwyTMpvH617yeIbQ==
Comprimento: 511551 (500K) [text/html]

Manipular o User-Agent

É possível definir um user-agent personalizado com a opção `–user-agent`. Por exemplo, para usar “MyCustomUserAgent”:

wget https://gf.dev --user-agent="MyCustomUserAgent"

A opção `–header` permite adicionar cabeçalhos HTTP personalizados. Isso é útil, por exemplo, ao testar uma aplicação com um IP específico, mas que requer um cabeçalho de host.

wget --header="Host: application.com" http://10.10.10.1

Com essa opção, é possível inserir qualquer cabeçalho HTTP necessário.

Conectar usando proxy

Em ambientes DMZ, o acesso à internet pode ser feito através de um proxy. Para configurar o proxy:

wget -e use_proxy=yes http_proxy=$PROXYHOST:PORT http://externalsite.com

Não se esqueça de substituir `$PROXYHOST:PORT` pelo endereço e porta do seu proxy.

Conectar usando um protocolo TLS específico

Para testar um protocolo TLS específico, é possível usar o `wget`:

wget --secure-protocol=TLSv1_2 https://example.com

Este comando força o `wget` a se conectar usando o TLS 1.2.

Conclusão

O `wget` é uma ferramenta versátil e poderosa para administradores de sistemas, auxiliando na resolução de problemas relacionados à web. Conhecer suas funcionalidades e opções é fundamental para um trabalho eficiente.