cURL es una herramienta de línea de comandos que encontramos en linux que nos permite transferir datos a través de una URL siendo muy útil para verificar conectividad hacia una determinada URL.
Curl soporta múltiples protocolos como DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet y TFTP.
Además, cURL soporta certificados SSL, HTTP POST, HTTP PUT, subidas FTP, cargas HTTP, proxies, HTTP/2, cookies, autenticación de usuario y contraseña (Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate y Kerberos), transferencia de archivos, proxy tunneling y otros más.
Pasemos a los ejemplos prácticos.
1- Saber la versión
curl --version
2- Testear una URL
curl https://twiter.com
3- Guardar con cURL
Hay varias opciones que podemos usar:
3.1. -O para guardar un archivo en el directorio actual.
curl -O http://dominio.com/log.tar.gz
3.2. -o que nos permite especificar una ruta, un ejemplo sería:
curl -o archivo_descargado.tar.gz http://dominio.com/log.tar.gz
3.3. Reanudar si se corta la comunicación
curl -C - -O http://dominio.com/log.tar.gz
3.4. Descargar varios archivos a la vez
curl -O http://dominio.com/log1.tar.gz -O http://otra_web.com/log2.tar.gz
3.5. Descargar muchos archivos
Podemos hacer uso de una lista para decirle a curl que las descargue. Creamos un archivo, test.txt y colocamos todas las URL’s y lanzamos el comando.
xargs –n 1 curl -O < test.txt
3.6. Otra forma de guardar
Podemos hacer que se descargue el contenido de un sitio a un archivo
curl https://dominio.com > resultado.html
4- Ver un encabezado Query HTTP
Los encabezados HTTP permiten que el servidor web remoto realice el proceso de envió de información adicional sobre sí junto con la solicitud real, esto es usado para ofrecer al cliente detalles sobre cómo se está administrando la solicitud actual.
curl -I https://twitter.com
5- En modo silencioso
Curl no va muestrar los detalles del progreso ni errores en la salida
curl -s https://twitter.com
6- Modo verboso
Podemos tener info detallada sobre una operación Curl usando la opción -v
curl -v https://twitter.com
Acá es recomendable combinar el punto 3.6, para que se guarde el resultado, dado que puede llegar a ser muy largo.
7- Limitar la descarga de un archivo
Si el ancho de banda es poco, podemos limitar la velocidad, en este ejemplo a 10k
curl --limit-rate 10K http://dominio.com/log.tar.gz -O
8- Descarga a travez de un proxy
curl -x proxy.dominio.com:9090 -U user:password -O http://dominio.com/log.tar.gz
9- FTP
9.1. Para descargar archivos de un servidor FTP
curl -u username:password -O ftp://Nombre_o_ip_FTP/log.tar.gz
9.2. Subir un archivo a un FTP
curl -u username:password -T log.tar.gz ftp://Nombre_o_ip_FTP
Ejemplos con Request
1- Para indicarle a cURL que utilice un método POST en la petición, usaremos la opción -X, –request.
curl -X POST https://twitter.com
2- HTTP POST request con datos
Post se puede utilizar para enviar algún tipo de información al servidor de destino, para eso usaremos la opción -d, –data.
Esto permite que cURL envíe datos como lo haría tu navegador al rellenar un formulario y hacer clic en enviar. Asimismo, cURL también se encarga de añadir la cabecera Content-Type con el valor application/x-www-form-urlencoded a la petición.
curl -X POST -d "field=value&tool=curl" https://postman-echo.com/post
3- HTTP POST request para subir archivos
Podemos subir un archivo con la opción -F, –form. Teniendo en cuenta que usaremos un @ para decirle a cURL que estamos haciendo un upload.
curl -X POST -F "field=@/home/nksistemas/test.txt" https://servidor_destino.com/post
Pero podemos enviar varios campos
curl -X POST -F "field=@/home/nksistemas/test.txt" -F "tool=curl" -F "other-file=@/home/nksistemas/test2.txt" https://servidor_destino.com/post
4- Subir un fichero cambiando el nombre
curl -X POST -F 'field=@"/home/nksistemas/test.txt";filename="test2.txt' https://servidor_destino.com/post
5- HTTP POST request con datos JSON
Usaremos las opciones -d con -H combinadas.
curl -X POST -d '{"field":"value"}' -H "Content-Type: application/json" https://servidor_destino.com/post
Otros ejemplos prácticos:
1- Saber si un sitio web da como valor 200 u otro.
Para hacer esto, debemos entender cuales son los distintos tipos de código de estado HTTP.
Los cuales se dividen en 5 «tipos».
Las cinco clases incluyen:
- 100: Códigos informativos que indican que la solicitud iniciada por el navegador continúa.
- 200: Los códigos con éxito regresaron cuando la solicitud del navegador fue recibida, entendida y procesada por el servidor.
- 300: Códigos de redireccionamiento devueltos cuando un nuevo recurso ha sido sustituido por el recurso solicitado.
- 400: Códigos de error del cliente que indican que hubo un problema con la solicitud.
- 500: Códigos de error del servidor que indican que la solicitud fue aceptada, pero que un error en el servidor impidió que se cumpliera.
Para hacer un script con curl que nos devuelva el valor de un sitio hacemos:
curl -o /dev/null --silent --head --write-out '%{http_code}\n' https://twitter.com
Donde
-o /dev/null
lanza lejos de la habitual salida--silent
arroja el indicador de progreso--head
hace que un JEFE de la solicitud HTTP, en lugar de OBTENER--write-out '%{http_code}\n'
imprime el requiere código de estado
Te dejo un script para chequear una lista de varios sitios, que estarán en un archivo sitios.txt
#!/bin/bash
while read LINE;
do curl -o /dev/null --silent --head --write-out '%{http_code}' "$LINE"
echo " $LINE"
done < sitios.txt