Una de las utilidades más utilizadas por los administradores de sistemas es wget. Puede ser muy útil durante la resolución de problemas relacionados con la web.

¿Qué es el comando wget?

el comando wget es una popular utilidad de línea de comandos de Unix/Linux para obtener el contenido de la web. Es de uso gratuito y proporciona una forma no interactiva de descargar archivos de la web. El comando wget soporta los protocolos HTTPS, HTTP y FTP fuera de la caja. Además, también puede utilizar proxies HTTP con él.

¿Cómo le ayuda wget a solucionar problemas?

Hay muchas maneras.

Como administrador de sistemas, la mayoría de las veces, usted estará trabajando en un terminal, y cuando la solución de problemas relacionados con la aplicación web, puede que no desee comprobar toda la página, pero sólo la conectividad. O, quiere verificar los sitios web de la intranet. O, quiere descargar una página determinada para verificar el contenido.

wget es no-interactivo, lo que significa que puede ejecutarlo en segundo plano aunque esté desconectado. Puede haber muchos casos en los que le resulte esencial desconectarse del sistema incluso cuando esté recuperando archivos de la web. En segundo plano, el wget se ejecutará y terminará su trabajo asignado.

También se puede utilizar para obtener todo el sitio web en sus máquinas locales. Puede seguir enlaces en páginas XHTML y HTML para crear una versión local. Para ello, tiene que descargar la página recursivamente. Esto es muy útil ya que puede utilizarlo para descargar páginas o sitios importantes para verlos sin conexión.

Veámoslo en acción. La sintaxis del wget es la siguiente.

wget [opción] [URL]

Descargar una página web

Intentemos descargar una página. Ej: github.com

wget github.com

Si la conectividad es correcta, entonces descargará la página principal y mostrará la salida como se muestra a continuación.

root@trends:~# wget github.com
URL transformada a HTTPS debido a una política HSTS
--2020-02-23 10:45:52-- https://github.com/
Resolviendo github.com (github.com)... 140.82.118.3
Conectando con github.com (github.com)|140.82.118.3|:443... conectado.
Solicitud HTTP enviada, esperando respuesta... 200 OK
Longitud: sin especificar [text/html]
Guardando en: 'index.html'

index.html [ <=> ] 131.96K --.-KB/s en 0.04s   

2020-02-23 10:45:52 (2.89 MB/s) - 'index.html' guardado [135126]

root@trends:~#

Descargar varios archivos

Práctico cuando tiene que descargar varios archivos a la vez. Esto puede darle una idea sobre la automatización de la descarga de archivos a través de algunos scripts.

Intentemos descargar los archivos Python 3.8.1 y 3.5.1.

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

Como puede adivinar, la sintaxis es la siguiente.

wget URL1 URL2 URL3

Sólo tiene que asegurarse de dejar espacio entre las URL.

Limitar la velocidad de descarga

Sería útil cuando quiera comprobar cuánto tiempo tarda en descargarse su archivo con diferentes anchos de banda.

Utilizando la opción --limit-rate, puede limitar la velocidad de descarga.

Aquí está la salida de la descarga del archivo Nodejs.

root@trends:~# wget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
--2020-02-23 10:59:58-- https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
Resolviendo nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ...
Conectando con nodejs.org (nodejs.org)|104.20.23.46|:443... conectado.
Solicitud HTTP enviada, esperando respuesta... 200 OK
Longitud: 14591852 (14M) [application/x-xz]
Guardando en: ‘node-v12.16.1-linux-x64.tar.xz’

node-v12.16.1-linux-x64.tar.xz 100%[===========================================================================================>]  13.92M --.-KB/s en 0.05s   

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

Ha tardado 0,05 segundos en descargar archivos de 13,92 MB. Ahora, intentemos limitar la velocidad a 500K.

root@trends:~# wget --limit-rate=500k https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
--2020-02-23 11:00:18-- https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
Resolviendo nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ...
Conectando con nodejs.org (nodejs.org)|104.20.23.46|:443... conectado.
Solicitud HTTP enviada, esperando respuesta... 200 OK
Longitud: 14591852 (14M) [application/x-xz]
Guardando en: ‘node-v12.16.1-linux-x64.tar.xz.1’

nodo-v12.16.1-linux-x64.tar.xz.1 100%[===========================================================================================>]  13.92M 501KB/s en 28s   

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

Reduciendo el ancho de banda tardó más en descargarse: 28 segundos. Imagínese, sus usuarios se quejan de una descarga lenta, y usted sabe que el ancho de banda de su red es bajo. Puede probar rápidamente --limit-rate para simular el problema.

Descarga en segundo plano

La descarga de archivos de gran tamaño puede llevar el tiempo o el ejemplo anterior en el que también desea establecer el límite de velocidad. Esto es lo esperado, pero ¿qué pasa si no quiere quedarse mirando su terminal?

Bueno, puede utilizar el argumento -b para iniciar el wget en segundo plano.

root@trends:~# wget -b https://slack.com
Continuando en segundo plano, pid 25430.
La salida se escribirá en 'wget-log.1'.
root@trends:~#

Ignorar error de certificado

Esto es útil cuando necesita comprobar aplicaciones web de la intranet que no tienen el certificado apropiado. Por defecto, wget lanzará un error cuando un certificado no sea válido.

root@trends:~# wget https://expired.badssl.com/
--2020-02-23 11:24:59-- https://expired.badssl.com/
Resolviendo expired.badssl.com (expirado.badssl.com)... 104.154.89.105
Conectando con caducado.badssl.com (caducado.badssl.com)|104.154.89.105|:443... conectado.
ERROR: no se puede verificar el 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':
  El certificado emitido ha caducado.
Para conectarse a expired.badssl.com de forma insegura, utilice `--no-check-certificate'.

El ejemplo anterior es para la URL en la que el certificado ha caducado. Como puede ver se ha sugerido utilizar --no-check-certificate que ignorará cualquier validación del cert.

root@trends:~# wget https://untrusted-root.badssl.com/ --no-check-certificate
--2020-02-23 11:33:45-- https://untrusted-root.badssl.com/
Resolviendo untrusted-root.badssl.com (raíz-no-confiable.badssl.com)... 104.154.89.105
Conectando con untrusted-root.badssl.com (untrusted-root.badssl.com)|104.154.89.105|:443... conectado.
ADVERTENCIA: no se puede verificar el certificado de untrusted-root.badssl.com, emitido por 'CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US':
  Certificado autofirmado encontrado.
Solicitud HTTP enviada, esperando respuesta... 200 OK
Longitud: 600 [text/html]
Guardando en: 'index.html.6'

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

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

root@trends:~#

Genial, ¿verdad?

Encabezado de respuesta HTTP

Vea en el terminal la cabecera de respuesta HTTP de un sitio determinado.

Utilizando -S imprimirá la cabecera, como puede ver a continuación para Coursera.

root@trends:~# wget https://www.coursera.org -S
--2020-02-23 11:47:01-- https://www.coursera.org/
Resolviendo www.coursera.org (www.coursera.org)... 13.224.241.48, 13.224.241.124, 13.224.241.82, ...
Conectando con www.coursera.org (www.coursera.org)|13.224.241.48|:443... conectado.
Petición HTTP enviada, esperando respuesta... 
  HTTP/1.1 200 OK
  Content-Type: text/html
  Contenido-Longitud: 511551
  Conexión: keep-alive
  Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0
  Fecha: Dom, 23 Feb 2020 11:47:01 GMT
  etag: W/"7156d-WcZHnHFl4b4aDOL4ZSrXP0iBX3o"
  Servidor: 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==
Longitud: 511551 (500K) [text/html]

Manipular el User-Agent

Puede darse la situación de que desee conectarse a un sitio utilizando un user-agent personalizado. O el user-agent de un navegador específico. Esto es posible especificando --user-agent. El siguiente ejemplo es para el agente de usuario como MyCustomUserAgent.

root@trends:~# wget https://gf.dev --user-agent="MiAgenteDeUsuarioPersonalizado"

Encabezado de host

Cuando una aplicación está aún en desarrollo, es posible que no disponga de una URL adecuada para probarla. O puede que desee probar una instancia HTTP individual utilizando IP, pero necesita suministrar la cabecera host para que la aplicación funcione correctamente. En esta situación, --header sería útil.

Tomemos un ejemplo para probar http://10.10.10.1 con la cabecera host como aplicacion.com

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

No sólo host, sino que puede inyectar cualquier cabecera que desee.

Conectarse utilizando un proxy

Si está trabajando en un entorno DMZ, es posible que no tenga acceso a sitios de Internet. Pero puede aprovechar el proxy para conectarse.

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

No olvide actualizar la variable $PROXYHOST:PORT con los reales.

Conectarse utilizando un protocolo TLS específico

Normalmente, recomendaría utilizar OpenSSL para probar el protocolo TLS. Pero, también puede utilizar wget.

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

Lo anterior forzará a wget a conectarse sobre TLS 1.2.

Conclusión

Conocer los comandos necesarios puede ayudarle en el trabajo. Espero que lo anterior le dé una idea de lo que puede hacer con wget.