cURL en Linux: qué debes saber antes de iniciarte

El software libre gratuito cURL es uno de los proyectos de código abierto más antiguos y populares. El programa, cuyo nombre viene de clientURL, se utiliza para enviar datos en redes informáticas. La licencia abierta otorga el derecho de uso del programa para cualquier fin. En la actualidad, cURL se utiliza en una multitud de dispositivos.

¿Qué es cURL?

El software cURL consta de dos componentes. La biblioteca del programa libcurl es la columna vertebral de la transferencia de datos y es compatible con los siguientes protocolos:

  • DICT
  • FILE
  • FTP
  • FTPS
  • GOPHER
  • HTTP
  • HTTPS
  • IMAP
  • IMAPS
  • LDAP
  • LDAPS
  • POP3
  • POP3S
  • RTMP
  • RTSP
  • SCP
  • SFTP
  • SMB
  • SMBS
  • SMTP
  • SMTPS
  • TELNET
  • TFTP

Por su parte, el programa de línea de comandos cURL actúa como una interfaz basada en texto e interactúa con libcurl a través de la línea de comandos.

El programa es una herramienta importante para el desarrollo web, porque permite al desarrollador comunicarse directamente con el servidor en lugar de tener que acceder a él desde un navegador. Los scripts basados en comandos cURL (en inglés: cURL commands) se utilizan para automatizar procesos, depurar y realizar pruebas.

¿Cómo funciona cURL?

Los dos componentes de cURL funcionan de maneras diferentes.

¿Cómo se utiliza libcurl?

La biblioteca del programa libcurl incluye funciones para enviar datos en redes informáticas. Existen enlaces de idioma o language bindings para decenas de lenguajes de programación. Por lo tanto, las funciones de libcurl están a disposición de un gran número de programas que se comunican con servidores.

¿Cómo se utiliza cURL?

El programa cURL de línea de comandos se utiliza para el desarrollo web. El método más sencillo es introducir los comandos cURL en la línea de comandos. Con los conocimientos adecuados es posible probar y depurar servidores y API.

En lugar de introducir los comandos manualmente en la línea de comandos, se pueden integrar en scripts. De este modo, se pueden estandarizar y automatizar operaciones complejas como, por ejemplo, subir o descargar datos, así como programar la cumplimentación de formularios y copiar sitios web completos.

El esquema de un cURL command suele tener la siguiente estructura:

# Esquema general de un cURL command
curl [opciones] <url>

En los ejemplos a continuación utilizamos la forma siguiente:

url="www.example.com"
curl [opciones] "$url"

Hemos externalizado el URL real en una variable. De este modo, con las opciones las que determinan el funcionamiento de la ejecución de cURL.

Ejemplos prácticos del cURL command en Linux

Para poder utilizar los siguientes ejemplos de cURL, necesitarás:

  1. Un ordenador con Linux o un sistema operativo similar a UNIX –también macOS.
  2. Acceso a la consola o a la línea de comandos.
  3. Un editor de código o editor de texto llano para componer los comandos.
Nota

Utiliza únicamente un editor de código o de texto llano para componer los comandos. Bajo ninguna circunstancia se deben utilizar procesadores de texto como Word, OpenOffice o LibreOffice para preparar el texto de la línea de comandos.

Primera prueba con cURL

En primer lugar, asegúrate de que cURL está instalado en el sistema. Para ello, abre la línea de comandos e introduce el siguiente comando (en ocasiones es necesario pulsar la tecla de retorno para que se ejecute el código).

# Comprobar que cURL está instalado
curl --version

Si se muestra un texto que comienza con curl y este va seguido de un número de versión, cURL estará instalado. Si cURL no está instalado, sigue las instrucciones de “Everything curl” para instalar el programa.

Consejo

Utiliza los comandos curl --help y curl --manual para obtener más información sobre el comando.

Además, debes abrir un nuevo documento en un editor de código. Puedes copiar los comandos allí para prepararlos antes de introducirlos en la línea de comandos. Cuando el comando esté listo, cópialo en la línea de comandos y ejecútalo.

Nota

Los comandos que se utilizan en la línea de comandos tienen muchas repercusiones. Básicamente, un comando mal escrito podría paralizar todo el sistema. Por eso es tan importante no copiar los comandos directamente de Internet y ejecutarlos sin más en la línea de comandos local. En lugar de esto, conviene tener una ventana vacía abierta en el editor de código. En ese recuadro, se pueden pegar los comandos: un paso intermedio que te obligará a comprobar detenidamente cada comando y adaptarlo si fuera necesario antes de ejecutarlo.

Descargar archivos con cURL

Acceder a los datos del servidor con cURL

En principio, con cURL podrás acceder a cualquier URL que conozcas. En este contexto, el verbo curl (rizar en inglés) describe el proceso de dirigirse a un URL con cURL. Prueba el ejemplo siguiente:

# Dirígete al siguiente sitio con cURL
site="www.google.com"
curl "$site"

Cuando ejecutas el código de esta manera, el resultado es un texto incomprensible. Esto se debe a que la página principal de Google se devuelve en formato HTML como respuesta al acceso cURL. La fuente HTML se muestra en la línea de comandos sin formatear. Para su correcta representación es necesario un navegador. Por lo general, es más útil guardar el archivo localmente.

Consejo

Introduce el comando clear en la línea de comandos para vaciar la pantalla. De este modo, se borrarán los datos innecesarios de la línea de comandos.

Acceder a un archivo con cURL y guardarlo en el disco duro local

Descargamos un logotipo de Wikipedia en inglés. La opción -O (o mayúscula y no cero), dirige a cURL para que utilice el nombre del archivo que se encuentra al final del URL. Con esta opción, cURL guardará el archivo descargado en el disco duro local con el mismo nombre.

# Una imagen de Wikipedia en inglés
archivo="https://en.wikipedia.org/static/images/project-logos/enwiki-2x.png"
# Abrir la imagen y guardarla localmente con el mismo nombre
curl "$archivo" -O

Sin embargo, ¿cómo se comporta con un URL que no incluye nombre de archivo? Prueba el código siguiente:

# Página de inicio de Google
homepage="www.google.com"
# Abrir la página de inicio con opción -O
curl "$homepage" -O

Como has podido comprobar, aparece un error porque el URL de la página de inicio de Google no contiene ningún nombre de archivo. En este caso, debes utilizar la opción -o (o minúscula) para asignarle un nombre de archivo.

# Página de inicio de Google
homepage="www.google.com"
# Nombre del archivo que se escribirá
nombre="homepage-google.html"
# Abrir página de inicio y guardarla localmente con el nombre seleccionado
curl "$homepage" -o "$name"

Reanudar la descarga con cURL si se ha interrumpido

Es posible que lo hayas sufrido alguna vez: llevas horas esperando a que se descargue un archivo de gran volumen cuando, de repente, se interrumpe la descarga y tienes que empezar de nuevo desde el principio. En este caso, la opción -C- te puede servir de ayuda:

# Un archivo de gran tamaño (genoma humano) para descargar
archivo="https://ftp.ncbi.nih.gov/genomes/refseq/vertebrate_mammalian/Homo_sapiens/reference/GCF_000001405.39_GRCh38.p13/GCF_000001405.39_GRCh38.p13_genomic.gbff.gz"
# Continuar descarga si se interrumpe
curl -C- -O "$archivo"
Nota

Si bien es cierto que la opción -C - incluye un espacio después de la C, se lee mejor y es más sencillo recordar la equivalencia -C- que hemos utilizado en el ejemplo.

Con cURL también puedes interrumpir una descarga manualmente si es necesario. Con archivos de gran tamaño puede suponer una ventaja; por ejemplo, cuando tienes que salir de casa y llevarte contigo el ordenador portátil.

Consejo

Puedes cancelar la ejecución en curso de cURL. Para cancelar, pulsa Ctrl + C varias veces si fuera necesario.

Comunicarse con el servidor mediante cURL

La función de descarga de cURL es similar a la popular herramienta de línea de comandos wget. No obstante, cURL no es un software especializado en descargas, sino que está diseñado para la comunicación general a través de redes, por lo que ofrece aún más ventajas.

Comprobar si un servidor es accesible con cURL

Con cURL podrás comprobar si un servidor es accesible. En este sentido, el funcionamiento de curl es similar al del comando ping. Sin embargo, debido a los protocolos y las opciones disponibles, cURL se puede utilizar con más flexibilidad. Además, ping trabaja en la capa de Internet, mientras que cURL funciona sobre la capa de aplicación. Eso significa que ping verifica si la máquina está en red. En cambio, el cURL command siguiente comprueba si un servidor reacciona y cómo lo hace:

# Verificar si un servidor web está disponible
server="google.com"
curl -I "$server"

Si después de ejecutar el código se muestra información de estado, el servidor estará disponible.

Distribuir encabezado con cURL

Con cada solicitud HTTP, además de transferirse el documento en sí, también se intercambian diferentes metadatos. Dichos datos, mencionados en el encabezado HTTP, describen tanto el documento como el estado de la solicitud HTTP. Seguramente te hayas topado alguna vez con el Error 404 No encontrado. Se trata, precisamente, de metadatos: el documento solicitado no se ha encontrado.

Echa un vistazo a la distribución del encabezado del URL “google.com”. Para ello, utiliza curl con la opción --head:

# Distribuir encabezado
url="google.com"
curl --head "$url"

Deberá visualizarse, entre otros mensajes: “301 Moved Permanently”. Se trata del código de estado HTTP para la redirección permanente. Lo que se observa es la redirección de [google.com] (sin “www”) a [www.google.com].

Consejo

En lugar de la opción --head, también puedes utilizar la escritura equivalente -I (i mayúscula). Para recordarla, piensa que accedes a la información de un URL y no a su contenido.

Analizar cadenas de redirección con cURL

La redirección HTTP (en inglés: redirects) se puede activar en serie. En este contexto, se utiliza el término redirect chain (o cadena de redirección). Imagina un sitio web cuya página de inicio sea [https://www.example.com/]. Pues bien, si nos dirigimos a este sitio desde [http://example.com], se producirán las siguientes redirecciones:

  • [http://example.com] → [https://example.com]
  • [https://example.com] → [https://www.example.com]
  • [https://www.example.com] → [https://www.example.com/]

Una concatenación de redireccionamientos conduce a tiempos de carga más largos e innecesarios y debe evitarse. Lamentablemente, se trata de un problema difícil de analizar. Cuando se carga la página en el navegador, se van sucediendo los redireccionamientos sin que el usuario apenas lo perciba. En este caso, te puede servir de ayuda la opción --location, que indica a cURL que siga hasta el último redireccionamiento. Aquí utilizamos la opción --head porque no nos interesa el contenido de las páginas.

# Comprobar redireccionamientos
url="google.com"
curl --location --head "$url"
Consejo

En lugar de la opción –location, también puedes utilizar la escritura equivalente -L (l mayúscula).

Trasladar datos al servidor con cURL

Además de acceder a datos, con cURL también podrás enviar datos a un servidor. Esto es muy práctico, por ejemplo, si queremos automatizar la cumplimentación automática de un formulario en línea. Además del método de solicitud POST, cURL también es compatible con GET.

Puesto que enviar datos es una tarea más compleja que acceder a ellos, solo podemos esbozar un ejemplo aproximativo. Para obtener información más detallada, consulta los consejos de “Everything curl”.

# Transferir datos al servidor
url="example.com"
# Introduce los datos como pares de valores clave separados por “&”
datos="nombre=Pedro&apellido=González&edad=42"
# Esta ejecución cURL transfiere los datos mediante POST
curl --data "$datos" "$url"
# Alternativamente, indica a cURL que transfiera los datos mediante GET
curl --data "$datos" "$url" --get

Leer cookies con cURL

Las cookies HTTP son pequeños archivos de texto que se almacenan localmente en el dispositivo del usuario cuando visita la mayoría de los sitios web. Dentro de tu navegador puedes ver y borrar las cookies de cualquier página que hayas visitado. Sin embargo, si lo que quieres es hacer pruebas, esto puede resultar demasiado engorroso. Con curl y la opción --cookie-jar (caja de galletas en castellano), también puedes acceder directamente a las cookies.

# Leer cookies
url="www.google.com"
cookies="cookies.txt"
curl --head --cookie-jar "$cookies" "$url"
# Mostrar cookies con el comando cat
cat "$cookies"
Consejo

Con la opción --cookie también puedes indicar a cURL que envíe cookies.

Opciones generales

Algunas de las opciones cURL disponibles se pueden combinar con las que ya hemos mencionado.

Mostrar información adicional

En algunos casos, la información representada en la ejecución de un cURL command no es suficiente. A continuación, puedes utilizar la opción --verbose. Un cURL command que incluya esa opción dará una mayor cantidad de información.

# Mostrar información adicional
url="www.google.com"
curl --verbose -I "$url"

Introducir usuario y contraseña con cURL

Algunos URL están cifrados con autenticación HTTP para evitar accesos no autorizados. ¿Qué ocurre si intentas acceder con cURL a este tipo de URL? Si no introduces el nombre de usuario y la contraseña, aparecerá el error HTTP 401 en pantalla. En ese caso, deberás utilizar el siguiente esquema:

# Introducir usuario y contraseña con cURL
# URL protegido por contraseña 
url="www.example.com/secure/"
# Usuario
usuario=""
# Contraseña
contraseña=""
curl --user "${nutzer}:${passwort}" "$url"
Consejo

También puedes utilizar curl para acceder a los datos de un servidor FTP. Utiliza para ello la opción --user para especificar un nombre de usuario y una contraseña.

Utilizar un proxy con cURL

Un proxy es un servidor intermedio. Utilizar un proxy puede ser útil por diversas razones. Por ejemplo, el proxy permite cumplir con mayor facilidad ciertos requisitos de seguridad y de rendimiento.

Cuando te conectas a Internet a través de un proxy, debes informar a cURL. Para ello, debes utilizar la opción --proxy:

# Utilizar un proxy con cURL
url="www.google.com"
proxy="proxy.example.com"
port="8080"
curl --proxy "${proxy}:${port}" "$url"
Nota

Si necesitas indicar el nombre de usuario y la contraseña en el servidor proxy, utiliza la opción --proxy-user. En ese caso, introduce el nombre de usuario y la contraseña siguiendo el formato “usuario: contraseña”.