wget


wget(1) es una utilería que permite descargar contenido de un web server.


Índice

  1. Introducción
  2. Instalación
    1. macOS 12
    2. macOS 10.14-10.15
  3. Referencias

Introducción

La utilería wget(1) es algo así como una «navaja suiza» cuando se trabaja en línea de comando para acceder a la Internet, específicamente a la WWW1,2.

Desafortunadamente (y para variar), no hay una implementación nativa para macOS, i.e., no es una utilería que venga ya incluida en el sistema operativo desde su origen. Algunos dirán que sí hay un equivalente, que sería curl con la opción -O, pero esto es más un punto de coincidencia entre las dos utilerías mas que una equivalencia.

$ curl -O URI

por lo que, a veces, puede ser necesario echar mano de las facilidades que wget(1) provee en lugar de buscar equivalencias, puntos de coincidencia o «hacer maromas» con distintos comandos.

Instalación

La forma más simple y directa (y la más floja) es conseguir «un port» mediante un administrador, como lo son MacPorts y Homebrew. Por ejemplo, con éste último:

$ brew install wget

Sin embargo, para quienes gustan saber qué es lo que agregan en sus equipos o tener una versión optimizada para éstos, nada como construirla directamente de los fuentes.

Construcción

Estas notas se iniciaron con macOS 10.14. y las instrucciones en ellas aplicaron casi sin problema para macOS 10.15. Algo de tiempo pasó desde entonces y algunas cosas cambiaron (no sólo hubo actualizaciones mayores en macOS sino también cambios en el mundo a su alrededor), por lo que se han dividido los apuntes de acuerdo a las versiones de macOS que se han probado.

macOS 12 (Macbook Pro M1 machine)

Instrucciones ejecutadas en ZSH shell. Salvo algunos cambios en los números de versión o forma de descargar los programas fuente, muchas instrucciones aún aplican.

1.- Preparación del ambiente de trabajo

% cd ~/Downloads
% mkdir wget-build
% cd wget-build

2.- Construyendo e instalando GMP

Al momento de actualizar estas notas no fue posible hacer uso de curl para descargar por FTP del sitio de GMP la biblioteca GNU de Aritmética Arbitraria de Múltiple Precisión (The GNU Multiple Precision Arithmetic Library); sitio donde también han habido cambios. En su lugar, se hizo una descarga vía browser de la versión actual y se procedió a desempaquetarla como se indica abajo. En el sitio de GMP se indica también cierta incertidumbre al respecto del registro de CPU x18 que Apple dice tener reservado, aunque esta librería lo utiliza y se desconocen las implicaciones de ello.

% tar --lzip -xf gmp-6.2.1.tar.lz
% pushd gmp-6.1.2
% CC=gcc CXX=g++ ./configure --prefix=/usr/local
% make
% make check
% sudo make install
% popd

3.- Construyendo e instalando LibNettle

Nettle es una biblioteca criptográfica diseñada para encajar en cualquier contexto: lenguajes de programación (C++, Python, Pike, Haskell), en aplicaciones como LSH o GNUPG, e inclusive en espacio del kernel.


% curl -O http://www.lysator.liu.se/~nisse/archive/nettle-3.7rc1.tar.gz
% tar -xzf nettle-3.7rc1.tar.gz
% pushd nettle-3.7rc1
% CFLAGS="-m64" ./configure --prefix=/usr/local --disable-assembler
% make
% sudo make install
% popd

4.- Construyendo e instalando pkg-config

Instrucciones para construir pkg-config.

5.- Construyendo e instalando Unbound

A diferencia de la experiencia con «Mojave» y «Catalina«, la versión de openSSL de miniconda, pese a ser actualizada, se seguía reportando como obsoleta (ver mensaje de error «configure: error: OpenSSL found in /Applications/miniconda3, but version 0.9.7 or higher is required«) en la sección Troubleshooting y notas. En esta ocasión se recurrió a la versión que puede ser instalada con brew.


% git clone https://github.com/NLnetLabs/unbound.git
% cd unbound
% ./configure --with-libexpat=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr --with-ssl=/opt/homebrew/opt/openssl@3
% make
% sudo make install
% cd /usr/local/etc
% sudo cp -r unbound /etc
% sudo /usr/local/sbin/unbound-anchor -a «/etc/unbound/root.key»

6.- Construyendo e instalando GnuTLS

A diferencia de la experiencia en macOS 10.14 y 10.15, con macOS 12 se requirió de algunas opciones más al momento de correr el script de configuración para GnuTLS.


% curl -O https://www.gnupg.org/ftp/gcrypt/gnutls/v3.7/gnutls-3.7.2.tar.xz
% tar -xvf gnutls-3.7.2.tar.xz
% pushd gnutls-3.7.2
% /usr/local/sbin/unbound-anchor -a "/etc/unbound/root.key"
% CFLAGS="-m64" CXXFLAGS="-m64" ./configure --prefix=/usr/local --without-p11-kit --with-included-libtasn1 --with-included-unistring
% make
% sudo make install
% popd

7.- Construyendo e instalando wget

Casi para terminar, wget se construye e instala con:

$ curl -O https://ftp.gnu.org/gnu/wget/wget-latest.tar.gz
$ tar xzf wget-latest.tar.gz
$ pushd wget-1.20.3
$ ./configure
$ make
$ sudo make install
$ popd

macOS 10.14, macOS 10.15

Instrucciones ejecutadas en BASH shell.

1.- Preparación del ambiente de trabajo

$ cd ~/Downloads
$ mkdir wget-build
$ cd wget-build

2.- Construyendo e instalando GMP

La versión a descargar puede verificarse en el sitio de GMP, la biblioteca GNU de Aritmética Arbitraria de Múltiple Precisión (The GNU Multiple Precision Arithmetic Library).

$ curl -O ftp://ftp.gmplib.org/pub/gmp-6.1.2/gmp-6.1.2.tar.bz2
$ tar xjf gmp-6.1.2.tar.bz2
$ pushd gmp-6.1.2
$ CC=gcc CXX=g++ ./configure --prefix=/usr/local
$ make
$ make check
$ sudo make install
$ popd

3.- Construyendo e instalando LibNettle

Nettle es una biblioteca criptográfica diseñada para encajar en cualquier contexto: lenguajes de programación (C++, Python, Pike, Haskell), en aplicaciones como LSH o GNUPG, e inclusive en espacio del kernel.


$ curl -O http://www.lysator.liu.se/~nisse/archive/nettle-3.4.1.tar.gz
$ tar xzf nettle-3.4.1.tar.gz
$ pushd nettle-3.4.1
$ CFLAGS="-m64" ./configure --prefix=/usr/local --disable-assembler
$ make
$ sudo make install
$ popd

4.- Construyendo e instalando pkg-config

Terminado el paso anterior, se intentó construir wget pero un mensaje de error indicaba que era necesario ya tener a pkg-config, lo que requirió acciones adicionales y derivaron en una página aparte.

5.- Construyendo e instalando Unbound

Este paso fue necesario pues durante la construcción de GnuTLS un warning (que parecía importante) se generó:


configure: WARNING:
***
*** The DNSSEC root key file in /etc/unbound/root.key was not found.
*** This file is needed for the verification of DNSSEC responses.
*** Use the command: unbound-anchor -a "/etc/unbound/root.key"
*** to generate or update it.
***

La utilería no se encontraba en el sistema y fue así necesario construirla también. Unbound es… bueno, en inglés se describe así «Unbound is a validating, recursive, and caching DNS resolver.» Es mantenido por NLNetLabs. En particular esta librería resultó problemática para compilar. Los valores de las opciones se determinaron tras varios intentos (ensayo y error), viendo primero en el script qué es lo que se buscaba y luego haciendo uso de find(1) para ver si se contaba con ello (pues se sospechaba así era) y dónde estaría (con lo que se vio que se buscaban un archivos C de cabecera, .h, y no propiamente archivos de bibliotecas). En este caso, se contaba con la instalación de miniConda, y ahí se encontró uno de ellos.


$ git clone https://github.com/NLnetLabs/unbound.git
$ cd unbound
$ ./configure --with-ssl=/Users/evasd/miniconda3 --with-libexpat=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr
$ make
$ sudo make install

Una vez construida se procedió a generar la llave requerida y a colocarla en /etc. Tras lo cual se continuó con GnuTLS.


$ cd /usr/local/etc
$ sudo cp -r unbound /etc

6.- Construyendo e instalando GnuTLS

GnuTLS es una biblioteca de funciones que implementan los protocolos SSL, TLS, y DTLS, así como las tecnologías a su alrededor.


$ curl -O https://www.gnupg.org/ftp/gcrypt/gnutls/v3.6/gnutls-3.6.8.tar.xz
$ tar xjf gnutls-3.6.8.tar.xz
$ pushd gnutls-3.6.8
$ CFLAGS="-m64" CXXFLAGS="-m64" ./configure --prefix=/usr/local --without-p11-kit
$ make
$ sudo make install
$ popd

7.- Construyendo e instalando wget

Casi para terminar, wget se construye e instala con:

$ curl -O https://ftp.gnu.org/gnu/wget/wget-latest.tar.gz
$ tar xzf wget-latest.tar.gz
$ pushd wget-1.20.3
$ ./configure
$ make
$ sudo make install
$ popd

8.- Probando y limpiando

Finalmente se procede a comprobar el uso de la librería con:

$ wget http://ftp.gnu.org/gnu/wget/wget-1.19.5.tar.gz
--2019-06-17 23:47:34-- http://ftp.gnu.org/gnu/wget/wget-1.19.5.tar.gz
Resolving ftp.gnu.org... 209.51.188.20
Connecting to ftp.gnu.org|209.51.188.20|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4455797 (4.2M) [application/x-gzip]
Saving to: 'wget-1.19.5.tar.gz'
wget-1.19.5.tar.gz 100%[===================>] 4.25M 3.33MB/s in 1.3s
2019-06-17 23:47:36 (3.33 MB/s) - 'wget-1.19.5.tar.gz' saved [4455797/4455797]
$

tras lo cual se procede a eliminar todo el cascajo generado

$ rm -rf wget-build

Troubleshooting y notas

* configure: error: OpenSSL found in /Applications/miniconda3, but version 0.9.7 or higher is required

  • Pese a que se actualizó la librería de conda y que después de ello el comando openssl version reportaba ser una versión mayor a la indicada en el mensaje de error, el problema persistía.
  • Solución: Se recurrió a brew para descargar openSSL y hacer uso de éste en el proceso de configuración para la compilación. Así que la solución consistió de los siguientes pasos:
    • Descarga e instalación con brew:

      % brew update
      % brew install openssl

    • Ejecución de configure (ver paso 5 de la instalación en macOS 12 para más detalles del parámetro usado en la invocación del script).

* Undefined symbols for architecture arm64

El siguiente mensaje de error apareció durante la compilación de GnuTLS en macOS Monterey en un equipo con chip Apple M1:


...
CC srp.lo
CC psk.lo
CC srp.lo
CC psk.lo
CCLD libgnutls.la
ld: warning: cannot export hidden symbol __gnutls_arm_cpuid_s from accelerated/.libs/libaccelerated.a(aarch64-common.o)
Undefined symbols for architecture arm64:
"_c_isdigit", referenced from:
__asn1_expand_object_id in libminitasn1.a(parser_aux.o)
__asn1_check_identifier in libminitasn1.a(parser_aux.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[4]: *** [libgnutls.la] Error 1
make[3]: *** [all-recursive] Error 1
make[2]: *** [all] Error 2
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

Por el momento sin respuesta. Reportado en GitLab.

* checking for libexpat… configure: error: Could not find libexpat, expat.h

  • Solución: se corrige instalando los componentes para línea de comando de Xcode: $ xcode-select --install.

* The pkg-config script could not be found or is too old

* The DNSSEC root key file in /etc/unbound/root.key was not found.

  • Solución: Ver el paso 5.

* The HSTS database must be a regular and non-world-writable file or ERROR: could not open HSTS store at ‘<path>/.wget-hsts’. HSTS will be disabled.

  • Solución: $chmod 660 <path>/.wget-hsts

* dyld: Library not loaded: /usr/local/lib/libgmp.10.dylib

En macOS Catalina, el siguiente mensaje de error aparece tras el upgrade del sistema operativo:

Referenced from: /usr/local/lib/libgnutls.30.dylib
Reason: image not found
make: *** [sync_raw] Abort trap: 6

  • Solución: La recompilación de la librería GMP (ver paso 2) eliminó el problema, aunque las pruebas de éste tuvieron problemas:

$ make check
...
Making check in mpz
...
PASS: bit
../../test-driver: line 107: 37874 Segmentation fault: 11 "$@" > $log_file 2>&1
FAIL: t-powm
...
PASS: t-limbs
============================================================================
Testsuite summary for GNU MP 6.1.2
============================================================================
# TOTAL: 63
# PASS: 62
# SKIP: 0
# XFAIL: 0
# FAIL: 1
# XPASS: 0
# ERROR: 0
============================================================================
See tests/mpz/test-suite.log
Please report to gmp-bugs@gmplib.org, see https://gmplib.org/manual/Reporting-Bugs.html
============================================================================
make[5]: *** [test-suite.log] Error 1
make[4]: *** [check-TESTS] Error 2
make[3]: *** [check-am] Error 2
make[2]: *** [check-recursive] Error 1
make[1]: *** [check-recursive] Error 1
make: *** [check] Error 2

Referencias

  1. «wget«, Wikipedia, web. Retrieved: 2019.05.13. URL: https://en.wikipedia.org/wiki/Wget.
  2. «wget«, Wikipedia, web. Retrieved: 2019.05.13. URL: https://es.wikipedia.org/wiki/GNU_Wget.
  3. «GNU wget«, GNU Operating System, web. Retrieved: 2019.05.13. URL: http://www.gnu.org/software/wget/.
  4. Neil Gee, «Install and Configure wget on macOS and fix SSL GNUTLS error«, Coolest Guides on the Planet, web. Published: 2018.10.03; visited: 2019.06.16. URL: https://coolestguidesontheplanet.com/install-and-configure-wget-macos/.
  5. Morgan Aldridge, «Building GnuTLS on Mac OS X«, GitHub gist 1753095, web. Visited: 2019.06.16. URL: https://gist.github.com/morgant/1753095.

Twitter Wordpress eMail
© Todos los derechos reservados.
Dr. Eduardo René Rodríguez Avila
Creación: 2019.05.13
Última actualización: 2021.11.13
El contenido de este sitio puede ser copiado y reproducido libremente mientras no sea alterado y se cite su origen. Marcas y productos registrados son citados por referencia y sin fines de lucro o dolo. Todas las opiniones son a título personal del o los autores de éstas y, salvo sea expresado de otro modo, deben considerarse como registro y expresión de la experiencia de uso de aquello que es tratado. Para conocer más sobre la posición de privacidad y responsabilidad de lo que se presenta en este sitio web y como ha sido obtenido, consulte la declaración al respecto.