Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| tutorial_de_curl [2024/07/06 17:27] – [Estados de Salida] peron | tutorial_de_curl [2026/04/21 16:09] (actual) – editor externo 127.0.0.1 | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | =====Curl===== | + | =====Tutorial de Curl===== |
| - | **curl** significa "cliente | + | ====Introducción==== |
| + | **curl** significa "Cliente | ||
| - | >Una transferencia de internet es una carga o descarga empleando un protocolo específico (curl soporta | + | Curl soporta |
| - | + | ||
| - | Soporta una gran cantidad de protocolos, desde HTTP, FTP y TELNET a IMAP, LDAP, y GOPHER. Operae en 92 sistemas operativos en cuenta con más de 20 mil millones de instalaciones en todo el mundo. Curl está liberado bajo una licencia MIT ligeramente modificada. | + | |
| + | ===Historia=== | ||
| curl comenzó originalmente en 1996 como un proyecto llamado httpget, de Rafael Sagula, quien luego transfirió el control del mismo a Daniel Stenberg. Daniel lo renombró a curl en 1998, y en 2000 dividió la funcionalidad de red de datos para colocarla en la biblioteca libcurl. Por lo cual curl en sí se trasnformó en un envolvedor para la línea de comandos alrededor de dicha biblioteca. | curl comenzó originalmente en 1996 como un proyecto llamado httpget, de Rafael Sagula, quien luego transfirió el control del mismo a Daniel Stenberg. Daniel lo renombró a curl en 1998, y en 2000 dividió la funcionalidad de red de datos para colocarla en la biblioteca libcurl. Por lo cual curl en sí se trasnformó en un envolvedor para la línea de comandos alrededor de dicha biblioteca. | ||
| - | En total, | + | Curl se encuentra liberado bajo una licencia MIT ligeramente modificada. Opera en 92 sistemas operativos en cuenta con más de 20 mil millones de instalaciones en todo el mundo. |
| + | ====Sintaxis de Curl==== | ||
| + | Desde la [[interpretes de comandos|línea de comandos]] operarás el comando '' | ||
| - | Ciclo de Lanzamientos | + | ===Sintaxis básica |
| - | Luego del lanzamiento, hay 10 días de espera, seguido por una ventana de 21 días para presentar funcionalidades nuevas, seguidas por un período de congelado | + | Para curl, todo lo que comience con '' |
| - | Curl cuenta con una extensa documentación | + | Existen // |
| - | + | ||
| - | curl --help | + | |
| - | + | ||
| - | Para ver la versión completa, puedes probar con curl --manual | + | |
| - | + | ||
| - | + | ||
| - | ====Opciones de la línea de Comando==== | + | |
| - | + | ||
| - | Curl se utiliza para realizar transferencias en Internet, donde actúa como [[cliente]], | + | |
| - | + | ||
| - | Curl soporta tanto protocolos no autenticados (como HTTP o FTP), como sus contrapartes autenticados (como HTTPS o SFTP). Los datos transferidos sobre un protocolo no autenticado pueden ser intereceptados y utilizados, de manera | + | |
| - | + | ||
| - | Curl actualmente cuenta con unas 250 opciones. | + | |
| - | + | ||
| - | Existen versiones | + | |
| <code bash> | <code bash> | ||
| Línea 36: | Línea 23: | ||
| </ | </ | ||
| - | ...y opciones largas (con guión | + | ...y //opciones |
| <code bash> | <code bash> | ||
| Línea 42: | Línea 29: | ||
| </ | </ | ||
| - | Todas las opciones están disponibles en el formato " | + | > Todas las //opciones |
| - | ====Opciones de Línea de Comandos ==== | + | ===Sintaxis complejas=== |
| + | Las órdenes más complejas recurren a este tipo de sintaxis. | ||
| - | Algunas opciones son del tipo booleano. Podremos activarlas con | + | ==Opciones Boleanas== |
| + | Algunas opciones son del tipo booleano. Podremos activarlas con: | ||
| <code bash> | <code bash> | ||
| curl --silent http:// | curl --silent http:// | ||
| </ | </ | ||
| - | o apagarlas: | + | |
| + | ...o desactivarlas con: | ||
| <code bash> | <code bash> | ||
| curl --no-silent http:// | curl --no-silent http:// | ||
| </ | </ | ||
| - | Algunas opciones aceptan argumentos | + | |
| + | ==Opciones Argumentadas== | ||
| + | Algunas opciones | ||
| <code bash> | <code bash> | ||
| curl --output / | curl --output / | ||
| </ | </ | ||
| - | Los argumentos que contienen espacios deben ir entrecomillados: | + | |
| + | Aquellos | ||
| <code bash> | <code bash> | ||
| curl -o /dev/null --write-out "type: %{content_type}" | curl -o /dev/null --write-out "type: %{content_type}" | ||
| </ | </ | ||
| - | ====URLs==== | ||
| - | Curl soporta URLs (en realidad, URIs) de manera | + | ===Transmisiones No autenticadas=== |
| + | Curl puede desactivar la verificación de servidor con la opción '' | ||
| + | |||
| + | >Los datos transferidos sobre un protocolo no autenticado pueden ser intereceptados y utilizados, de manera que siempre es mejor usar los autenticados. | ||
| + | |||
| + | |||
| + | ====URLs==== | ||
| - | '' | + | Todo aquello que pasemos a curl que no comience con '' |
| - | * __scheme__ define un protocolo (como https o ftp). Se es omitido, curl intentará adivinarlo. Los usuarios y contraseñas son credenciales | + | Curl soporta URLs según la forma de URIs aceptada |
| - | * __Host__ es el nombre de host, nombre de dominio | + | |
| - | * __port__ es el número de puerto. Si se omite, curl usará el puerto por defecto asociado con el scheme (tal como 80 para http o 443 para https). | + | |
| - | * __path__ es la ruta al recurso en el servidor. | + | |
| - | * __query__ es usualmente una secuencia de pares '' | + | |
| - | Para curl, todo lo que comience | + | * '' |
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| - | ====Solicitud==== | + | ===Solicitud=== |
| - | Si debemos | + | Si fuese necesario |
| <code bash> | <code bash> | ||
| - | curl http:// | + | curl http:// |
| </ | </ | ||
| - | ====URL Múltiples==== | + | ===URL Múltiples=== |
| - | Curl acepta cualquier | + | Curl acepta cualquier |
| <code bash> | <code bash> | ||
| Línea 97: | Línea 98: | ||
| </ | </ | ||
| - | (de aquí en mas, en ocasiones mostraré comandos | + | > |
| La opción '' | La opción '' | ||
| + | |||
| <code bash> | <code bash> | ||
| curl --output-dir /tmp | curl --output-dir /tmp | ||
| - | -O http:// | + | -O http:// |
| - | -O http:// | + | -O http:// |
| && ls /tmp | && ls /tmp | ||
| </ | </ | ||
| - | Para guardar ambas respuestas en el mismo fichero, | + | Para guardar ambas respuestas en un mismo fichero, |
| <code bash> | <code bash> | ||
| curl http:// | curl http:// | ||
| Línea 117: | Línea 120: | ||
| ===Englobado de URL=== | ===Englobado de URL=== | ||
| - | Curl expande automáticamente | + | Curl expande automáticamente |
| - | Pore ejemplo, este comando solicita tres rutas distintas (al, bt, gm), cada una con dos parámetros distintos (num=1 y num=2), | + | Por ejemplo, este comando solicita tres rutas distintas ('' |
| <code bash> | <code bash> | ||
| curl --output-dir /tmp -o " | curl --output-dir /tmp -o " | ||
| - | http:// | + | http:// |
| && ls /tmp | && ls /tmp | ||
| </ | </ | ||
| - | Podremos | + | Si en las URLs indicadas existiesen los caracteres interpretables de englobado (''< |
| ====Transferencias en paralelo==== | ====Transferencias en paralelo==== | ||
| - | Es posible usar '' | + | Es posible usar la opción |
| ====Fichero de Configuración==== | ====Fichero de Configuración==== | ||
| - | En la medida que se incrementa el número de opciones, el comando Curl se volverá más difícil de descifrar. Para hacerlo más legible, | + | En la medida que se incrementa el número de opciones, el comando Curl se volverá más difícil de descifrar. Para hacerlo más legible, |
| + | < | ||
| Config file | Config file | ||
| output-dir /tmp | output-dir /tmp | ||
| show-error | show-error | ||
| silent | silent | ||
| + | </ | ||
| - | Por defecto, Curl lee el fichero de configuración desde '' | + | Por defecto, Curl lee el fichero de configuración desde '' |
| <code bash> | <code bash> | ||
| curl --config / | curl --config / | ||
| </ | </ | ||
| - | ====Medidores de Progreso==== | ||
| - | Curl cuenta con dos medidores | + | ====Reseteo |
| + | |||
| + | Debemos estar atentos que al configurar las opciones de curl, tal configuración se aplicará a todas las URLs que procese curl. Por ejemplo, aquí ambos encabezados se envían a ambas URLs: | ||
| <code bash> | <code bash> | ||
| - | curl --no-silent | + | curl |
| + | | ||
| + | | ||
| </ | </ | ||
| - | El otro es compacto: | + | En ocasiones no deseamos hacer esto. Para resetear el estado entre las llamadas a las URLS, debemos recurrir a la opción '' |
| <code bash> | <code bash> | ||
| - | curl --no-silent | + | curl |
| + | | ||
| + | | ||
| + | | ||
| </ | </ | ||
| - | La opción '' | + | |
| + | ====Medidor de Progreso==== | ||
| + | |||
| + | Curl cuenta con dos medidores de progreso distintos para saber cómo va la transferencia ordenada. | ||
| + | |||
| + | ==Indicador de progreso verboso== | ||
| <code bash> | <code bash> | ||
| - | curl --silent http:// | + | curl --no-silent http:// |
| </ | </ | ||
| - | ====Reseteo | + | ==Indicador |
| + | El otro es indicador compactito: | ||
| - | Cuando configuras opciones, se aplican a todas las URLs que procesa Curl. Por ejemplo, aquí ambos encabezados se envían a ambas URLs: | ||
| <code bash> | <code bash> | ||
| - | curl | + | curl --no-silent |
| - | | + | |
| - | | + | |
| </ | </ | ||
| - | A veces esto no es lo que se desea. Para resetear el estado entre las llamadas a URLS, se usa la opción '' | + | ==Desactivar indicación de progreso== |
| + | La opción '' | ||
| <code bash> | <code bash> | ||
| - | curl | + | curl --silent |
| - | | + | |
| - | --next | + | |
| - | -H " | + | |
| </ | </ | ||
| + | |||
| ====Curl Básico==== | ====Curl Básico==== | ||
| - | Ahora que entendemos cómo funciona Curl y sus opciones, podremos ver sus opciones específicas. | + | Ahora que entendemos cómo funciona Curl y la sintaxis de sus opciones, podremos ver sus opciones específicas. |
| + | ==Versionado== | ||
| + | '' | ||
| - | --version (-V) explica todo sobre la versión instalada de curl: | ||
| <code bash> | <code bash> | ||
| curl -V | curl -V | ||
| </ | </ | ||
| - | Lista linea a línea las versiones de Curl en sí y sus dependencias, | + | |
| + | ...listará | ||
| '' | '' | ||
| + | |||
| <code bash> | <code bash> | ||
| curl -v http:// | curl -v http:// | ||
| </ | </ | ||
| - | Si '' | + | |
| + | Si '' | ||
| <code bash> | <code bash> | ||
| curl --trace - http:// | curl --trace - http:// | ||
| </ | </ | ||
| - | o bien '' | + | |
| + | ...o bien con '' | ||
| </code bash> | </code bash> | ||
| curl --trace-ascii - http:// | curl --trace-ascii - http:// | ||
| </ | </ | ||
| - | Usa '' | + | Utiliza |
| <code bash> | <code bash> | ||
| curl | curl | ||
| Línea 215: | Línea 236: | ||
| http:// | http:// | ||
| </ | </ | ||
| + | |||
| ...o algunos encabezados de la respuesta: | ...o algunos encabezados de la respuesta: | ||
| + | |||
| <code bash> | <code bash> | ||
| curl | curl | ||
| Línea 224: | Línea 247: | ||
| ====Descargas==== | ====Descargas==== | ||
| - | '' | + | La opción |
| <code bash> | <code bash> | ||
| Línea 232: | Línea 255: | ||
| </ | </ | ||
| - | Si dicho directorio | + | Si tal directorio |
| <code bash> | <code bash> | ||
| Línea 238: | Línea 261: | ||
| -O http:// | -O http:// | ||
| - | && cat /tmp/some/place/uuid | + | && cat /tmp/alguna/ruta/uuid |
| </ | </ | ||
| - | Puedes usar '' | + | Puedes usar '' |
| - | ====Reintentar==== | + | ===Reintentado=== |
| - | A veces puede que el huésped remoto | + | A veces puede suceder |
| <code bash> | <code bash> | ||
| Línea 253: | Línea 276: | ||
| (esta URL falla el 50% de las veces) | (esta URL falla el 50% de las veces) | ||
| - | Podrás indicar la cantidad máxima de tiempo | + | Podrás indicar la cantidad máxima de tiempo que Curl invertirá en intentar nuevamente |
| <code bash> | <code bash> | ||
| Línea 261: | Línea 284: | ||
| </ | </ | ||
| - | Para Curl, " | + | Para Curl, " |
| ====Subidas==== | ====Subidas==== | ||
| - | Curl a menudo se usa para bajar información (descargar) del servidor, pero también puede subirla. Para ello use la opción --upload-file (-T): | + | Curl a menudo se usa para bajar información (descargar) del servidor, pero también puede subirla. Para ello use la opción |
| <code bash> | <code bash> | ||
| - | echo hola > / | + | echo "hola Tercer Mundo!" |
| curl -T / | curl -T / | ||
| </ | </ | ||
| - | Para cargas HTTP, Curl usa el método PUT. | + | Para las cargas |
| ===Controles de Transferencia=== | ===Controles de Transferencia=== | ||
| - | Para detener descargas lentas, | + | Para detener |
| Por ejemplo, para permitir no menos de 10 bytes/ | Por ejemplo, para permitir no menos de 10 bytes/ | ||
| + | |||
| <code bash> | <code bash> | ||
| curl -v --speed-limit 10 --speed-time 3 http:// | curl -v --speed-limit 10 --speed-time 3 http:// | ||
| </ | </ | ||
| - | Para limitar el uso de ancho de banda, | + | Para limitar el uso de ancho de banda, |
| <code bash> | <code bash> | ||
| Línea 306: | Línea 330: | ||
| ===Resolución de nombre=== | ===Resolución de nombre=== | ||
| - | Por defecto, curl usa tu servidor DNS para resolver | + | Por defecto, curl usa tu servidor DNS para resolver |
| <code bash> | <code bash> | ||
| - | curl --resolve | + | curl --resolve |
| http:// | http:// | ||
| + | </ | ||
| + | ...(este falla porque nadie escucha en 127.0.0.1) | ||
| - | (este falla porque nadie escucha en 127.0.0.1) | + | O puedes incluso mapear un par '' |
| - | + | ||
| - | O puedes incluso mapear un par '' | + | |
| <code bash> | <code bash> | ||
| - | curl --connect-to | + | curl --connect-to |
| - | http://httpbingo.org:8080/get | + | http://texto-plano.xyz:443/ |
| </ | </ | ||
| Línea 333: | Línea 357: | ||
| <code bash> | <code bash> | ||
| - | |||
| - | |||
| (este falla) | (este falla) | ||
| Línea 340: | Línea 362: | ||
| <code bash> | <code bash> | ||
| - | |||
| - | |||
| (este funciona bien) | (este funciona bien) | ||
| ===Credenciales=== | ===Credenciales=== | ||
| - | Casi nunca querrás pasar nombre de usuario y contraseña en el comando de curl en s{i. Una forma de evitarlo es usar el fichero '' | + | Casi nunca querrás pasar nombre de usuario y contraseña en el comando de curl en sí. Una forma de evitarlo es usar el fichero '' |
| < | < | ||
| Línea 377: | Línea 397: | ||
| Puede acceder al status de salida a través de la variable de intérprete '' | Puede acceder al status de salida a través de la variable de intérprete '' | ||
| - | ====HTTP==== | + | ===HTTP=== |
| Principalmente, | Principalmente, | ||
| Línea 569: | Línea 589: | ||
| >Las condiciones Timestamp confían en el encabezado de respuesta Last-Modified (" | >Las condiciones Timestamp confían en el encabezado de respuesta Last-Modified (" | ||
| + | |||
| + | ===Envío HTTP=== | ||
| + | |||
| + | '' | ||
| + | |||
| + | Puede usar '' | ||
| + | |||
| + | <code bash> | ||
| + | curl -d name=fulana -d edad=25 http:// | ||
| + | </ | ||
| + | |||
| + | |||
| + | Para enviar datos desde un fichero, usamos '' | ||
| + | |||
| + | <code bash> | ||
| + | echo " | ||
| + | |||
| + | curl -d @/ | ||
| + | http:// | ||
| + | </ | ||
| + | |||
| + | |||
| + | '' | ||
| + | |||
| + | Para enviar datos JSON, usamos '' | ||
| + | |||
| + | <code bash> | ||
| + | curl --json ' | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==Solicitudes JSON== | ||
| + | Usamos '' | ||
| + | |||
| + | Para condificar datos de URL-encode (escapar todos los símbolos no permitidos en las URLs), use el '' | ||
| + | |||
| + | <code bash> | ||
| + | curl --data-urlencode " | ||
| + | </ | ||
| + | |||
| + | ==Envío de formularios multiparte== | ||
| + | |||
| + | '' | ||
| + | |||
| + | Cada parte tiene un nombre, encabezados, | ||
| + | |||
| + | < | ||
| + | --------------------------d74496d66958873e | ||
| + | Content-Disposition: | ||
| + | |||
| + | Anónimo | ||
| + | --------------------------d74496d66958873e | ||
| + | Content-Disposition: | ||
| + | Content-Type: | ||
| + | |||
| + | contenidos del fichero | ||
| + | --------------------------d74496d66958873e-- | ||
| + | </ | ||
| + | |||
| + | Para construir estas solicitudes multipartes con curl, usamos '' | ||
| + | |||
| + | <code bash> | ||
| + | touch / | ||
| + | |||
| + | curl -F nombre=Fulana -F edad=25 -F foto=@/ | ||
| + | http:// | ||
| + | </ | ||
| + | |||
| + | ===Redirecciones=== | ||
| + | |||
| + | Una redirección sucede cuando el servidor, en lugar de devolver el recurso solicitado, le dice al cliente que el recurso está localizado en otro lado (como se indica en el encabezado de Locación). La redirección siempre tiene un código de respuesta '' | ||
| + | |||
| + | Por defecto, Curl no sigue el redireccionamiento, | ||
| + | |||
| + | <code bash> | ||
| + | curl -i http:// | ||
| + | </ | ||
| + | |||
| + | Para hacer que Curl sigua redirecciones, | ||
| + | |||
| + | <code bash> | ||
| + | curl -L http:// | ||
| + | </ | ||
| + | |||
| + | Para protegerse contra redirecciones en bucle sinfín, use el limitador '' | ||
| + | |||
| + | <code bash> | ||
| + | curl -L --max-redirs 3 http:// | ||
| + | </ | ||
| + | |||
| + | ===HTTP PUT=== | ||
| + | |||
| + | A menudo se usa el método '' | ||
| + | |||
| + | <code bash> | ||
| + | echo "Hola Tercer Mundo!" | ||
| + | |||
| + | curl -T / | ||
| + | </ | ||
| + | |||
| + | En ocasiones, se utiliza '' | ||
| + | |||
| + | <code bash> | ||
| + | curl -X PUT -H " | ||
| + | -d ' | ||
| + | http:// | ||
| + | </ | ||
| + | |||
| + | ==Cookies== | ||
| + | |||
| + | El protocolo HTTP carece de estado, y las cookies fueron concebidas como un método ingenioso para sortear esto, siguiendo este mecanismo general: | ||
| + | |||
| + | * El servidor desea asociar algún estado con la sesión del cliente. | ||
| + | * El servidor devuelve el estado en el encabezado de respueta Set-Cookie. | ||
| + | * El cliente reconoce las cookies y las envía de vuelta con cada solicitud incorporada al encabezado de solicitud de la cookie. | ||
| + | |||
| + | Cada cookie tiene una fecha de vencimiento - ya sea explífita o una de "fin de sesión" | ||
| + | |||
| + | Por defecto, Curl ignora las cookies. Para activarlas, use la opción '' | ||
| + | |||
| + | >Aunque su reputación ha sido ensuciada por los infames " | ||
| + | |||
| + | Aquí el servidor establece la //sessionid de cookie// al valor '' | ||
| + | |||
| + | <code bash> | ||
| + | curl -b "" | ||
| + | http:// | ||
| + | |||
| + | && cat / | ||
| + | </ | ||
| + | |||
| + | ...Las llamadas subsecuentes con '' | ||
| + | |||
| + | Curl descarta automáticamente las cookies del jarro de cookies cuando superan su vencimiento | ||
| + | |||
| + | <code bash> | ||
| + | curl -j -b / | ||
| + | </ | ||
| + | |||
| + | ===Servicios alternativos=== | ||
| + | |||
| + | El encabezado de respuesta HTTP //Alt-Svc// indica que existe otra localización de red (un servicio alternativo) que el cliente podría utilizar para solicitudes futuras. | ||
| + | |||
| + | Para permitir los servicios alternativos, | ||
| + | |||
| + | <code bash> | ||
| + | curl --alt-svc / | ||
| + | http:// | ||
| + | |||
| + | && cat / | ||
| + | </ | ||
| + | |||
| + | ===Seguridad Estricta de Transporte HTTP=== | ||
| + | |||
| + | El encabezado de respuesta HTTP // | ||
| + | |||
| + | Para hacer que curl respete esta represión impuesta por el HSTS, use '' | ||
| + | |||
| + | <code bash> | ||
| + | curl --hsts /tmp/hsts -o /dev/null | ||
| + | http:// | ||
| + | |||
| + | && cat /tmp/hsts | ||
| + | </ | ||
| + | |||
| + | ====Documentación==== | ||
| + | Curl cuenta con una extensa documentación de referencia. Puedes verla con: | ||
| + | <code bash> | ||
| + | curl --help | ||
| + | </ | ||
| + | |||
| + | Para ver la versión completa del manual, puedes probar con: | ||
| + | <code bash> | ||
| + | |||
| + | ====Conclusión==== | ||
| + | Curl es una de las herramientas predilectas para las transferencias electrónicas, | ||
| + | |||
| + | <code bash> | ||
| + | gab -m " | ||
| + | </ | ||
| + | |||
| + | |||
