Traducción del tutorial de la página oficial del comando cURL: https://curl.se/docs/manual.html
Go to file
2022-09-23 07:54:41 +02:00
img Primer commit, con README y archivo de img 2022-09-23 00:38:51 +02:00
README.md Añado enlace petición web GET a la API 2022-09-23 07:54:41 +02:00

Traducción del manual oficial de cURL

Página oficial / Repositorio git / Tutorial original

petición web GET a la API

tutorial de curl

Uso simple

Obtener la página principal de un servidor web:

curl https://www.ejemplo.es/

Obtener un archivo README de un servidor FTP:

curl ftp://ftp.funet.fi/README

Obtener una página web desde un servidor usando el puerto 8000:

curl http://www.weirdserver.com:8000/

Obtener un listado de directorios de un sitio FTP:

curl ftp://ftp.funet.fi

Obtener la definición de curl de un diccionario:

curl dict://dict.org/m:curl

Obtener dos documentos a la vez:

curl ftp://ftp.funet.fi/ http://www.weirdserver.com:8000/

Obtener un archivo de un servidor FTPS

curl ftps://files.are.secure.com/secrets.txt

o utilice la forma más apropiada de FTPS para obtener el mismo archivo

curl --ftp-ssl ftp://files.are.secure.com/secrets.txt

Obtener un archivo de un servidor SSH usando SFTP:

curl -u nombre de usuario sftp://example.com/etc/issue

Obtener un archivo de un servidor SSH usando SCP utilizando una clave privada (no protegida por contraseña) para autenticar:

curl -u nombre_de_usuario: --key ~/.ssh/id_rsa scp://ejemplo.com/~/archivo.txt

Obtener un archivo de un servidor SSH mediante SCP utilizando una clave privada (protegida por contraseña) para autenticarse:

curl -u nombre_de_usuario: --key ~/.ssh/id_rsa --pass clave_privada_contraseña
scp://ejemplo.com/~/archivo.txt

Obtener la página principal de un servidor web IPv6:

curl "http://[2001:1890:1112:1::20]/"

Obtener un archivo de un servidor SMB:

curl -u "dominio\nombre-de-usuario:passwd" smb://servidor.ejemplo.com/compartir/archivo.txt

Descargar a un archivo

Obtener una página web y almacenarla en un archivo local con un nombre específico:

curl -o esapágina.html http://www.example.com/

Obtener una página web y almacenarla en un archivo local, hacer que el archivo local obtenga el nombre del documento remoto (si no se especifica ninguna parte del nombre del archivo en la URL, esto fallará)

curl -O http://www.example.com/index.html

Obtenga dos archivos y almacénelos con sus nombres remotos:

curl -O www.haxx.se/index.html -O curl.se/download.html

Uso de contraseñas

FTP

Para enviar archivos por ftp utilizando el nombre y la contraseña, inclúyalos en la URL como

curl ftp://name:passwd@machine.domain:port/full/path/to/file

o especifíquelos con la bandera -u como

curl -u nombre:contraseña ftp://machine.domain:port/full/path/to/file

FTPS

Es igual que para el FTP, pero también puede especificar y utilizar opciones específicas de SSL para los certificados, etc.

Tenga en cuenta que el uso de FTPS:// como prefijo es la forma implícita descrita en los estándares, mientras que la forma explícita recomendada se realiza utilizando FTP:// y la opción --ssl-reqd.

SFTP / SCP

Es similar a FTP, pero se puede utilizar la opción --key para especificar una clave privada a utilizar en lugar de una contraseña. Tenga en cuenta que la clave privada puede estar protegida por una contraseña que no está relacionada con la contraseña de inicio de sesión del sistema remoto; esta contraseña se especifica utilizando la opción --pass. Normalmente, curl extrae automáticamente la clave pública del archivo de clave privada, pero en los casos en los que curl no tiene el soporte de biblioteca adecuado, se debe especificar un archivo de clave pública que coincida con la opción --pubkey.

HTTP

cURL también soporta el usuario y la contraseña en las URLs HTTP, por lo que se puede escoger un archivo como

curl http://name:passwd@machine.domain/full/path/to/file

o especificar el usuario y la contraseña por separado como en

curl -u nombre:passwd http://machine.domain/full/path/to/file

HTTP ofrece muchos métodos diferentes de autenticación y curl soporta varios: Basic, Digest, NTLM y Negotiate (SPNEGO). Si no se indica qué método utilizar, curl utiliza por defecto el básico. También puedes pedirle a curl que elija los más seguros de entre los que el servidor acepta para la URL dada, usando --anyauth.

Nota: De acuerdo con la especificación de la URL, las URLs HTTP no pueden contener un usuario y una contraseña, por lo que ese estilo no funcionará cuando se utilice curl a través de un proxy, aunque curl lo permita en otras ocasiones. Cuando utilice un proxy, debe utilizar el estilo -u para el usuario y la contraseña.

HTTPS

Probablemente se utiliza más comúnmente con certificados privados, como se explica a continuación.

Proxy

curl soporta servidores proxy HTTP y SOCKS, con autenticación opcional. No tiene soporte especial para servidores proxy FTP ya que no hay estándares para ellos, pero aún así puede hacerse funcionar con muchos de ellos. También puedes utilizar proxies HTTP y SOCKS para transferir archivos desde y hacia servidores FTP.

Obtenga un archivo ftp utilizando un proxy HTTP llamado mi-proxy que utiliza el puerto 888:

curl -x mi-proxy:888 ftp://ftp.leachsite.com/README

Obtenga un archivo de un servidor HTTP que requiera usuario y contraseña, utilizando el mismo proxy anterior

curl -u usuario:passwd -x mi-proxy:888 http://www.get.this/

Algunos proxies requieren una autenticación especial. Especifique utilizando -U como en el caso anterior:

curl -U usuario:contraseña -x mi-proxy:888 http://www.get.this/

Se puede especificar una lista separada por comas de hosts y dominios que no utilizan el proxy como

curl --noproxy localhost,get.this -x mi-proxy:888 http://www.get.this/

Si el proxy se especifica con --proxy1.0 en lugar de --proxy o -x, entonces curl utilizará HTTP/1.0 en lugar de HTTP/1.1 para cualquier intento de CONNECT.

curl también soporta proxies SOCKS4 y SOCKS5 con --socks4 y --socks5.

Vea también las variables de entorno que soporta Curl y que ofrecen un mayor control del proxy.

La mayoría de los servidores proxy FTP están configurados para aparecer como un servidor FTP normal desde la perspectiva del cliente, con comandos especiales para seleccionar el servidor FTP remoto. curl soporta las opciones -u, -Q y --ftp-account que se pueden utilizar para configurar las transferencias a través de muchos proxies FTP. Por ejemplo, se puede subir un archivo a un servidor FTP remoto utilizando un proxy FTP de Blue Coat con las opciones

curl -u "username@ftp.server Proxy-Username:Remote-Pass"
  --ftp-account Proxy-Password --upload-file local-file
  ftp://my-ftp.proxy.server:21/remote/upload/path/

Consulte el manual de su proxy FTP para determinar la forma en que espera establecer las transferencias, y la opción -v de curl para ver exactamente lo que curl está enviando.

Rangos

HTTP 1.1 introdujo los rangos de bytes. Usando esto, un cliente puede solicitar obtener sólo una o más subpartes de un documento especificado. Curl lo soporta con la bandera -r.

Obtenga los primeros 100 bytes de un documento:

curl -r 0-99 http://www.get.this/

Obtenga los últimos 500 bytes de un documento:

curl -r -500 http://www.get.this/

Curl también admite rangos simples para archivos FTP. En este caso, sólo puede especificar la posición de inicio y de parada.

Obtenga los primeros 100 bytes de un documento mediante FTP:

curl -r 0-99 ftp://www.get.this/README

Uploading

FTP / FTPS / SFTP / SCP

Subir todos los datos en stdin a un servidor especificado:

curl -T - ftp://ftp.upload.com/myfile

Subir datos de un archivo especificado, iniciar sesión con usuario y contraseña:

curl -T uploadfile -u usuario:passwd ftp://ftp.upload.com/myfile

Subir un archivo local al sitio remoto, y utilizar el nombre del archivo local en el sitio remoto también:

curl -T uploadfile -u usuario:passwd ftp://ftp.upload.com/

Subir un archivo local para que se anexe al archivo remoto:

curl -T archivo local -a ftp://ftp.upload.com/remotefile

cURL también admite la carga de ftp a través de un proxy, pero sólo si el proxy está configurado para permitir ese tipo de túnel. Si lo hace, puede ejecutar curl de forma similar a

curl --proxytunnel -x proxy:port -T localfile ftp.upload.com

SMB / SMBS

curl -T archivo.txt -u "nombre de usuario del dominio:contraseña"
  smb://servidor.ejemplo.com/compartir/

HTTP

Sube todos los datos en stdin a un sitio HTTP especificado:

curl -T - http://www.upload.com/myfile

Tenga en cuenta que el servidor HTTP debe haber sido configurado para aceptar PUT antes de que esto pueda hacerse con éxito.

Para otras formas de subir datos HTTP, vea la sección POST más abajo.

Verbose / Debug

Si curl falla donde no debe, si los servidores no le dejan entrar, si no puede entender las respuestas: use la bandera -v para obtener una obtención verbosa. Curl mostrará mucha información y lo que envía y recibe para que el usuario vea toda la interacción cliente-servidor (pero no le mostrará los datos reales).

curl -v ftp://ftp.upload.com/

Para obtener aún más detalles e información sobre lo que hace curl, pruebe a utilizar las opciones --trace o --trace-ascii con un nombre de archivo dado para registrar, así

curl --trace trace.txt www.haxx.se

Información detallada

Diferentes protocolos proporcionan diferentes maneras de obtener información detallada sobre archivos/documentos específicos. Para que curl muestre información detallada sobre un solo archivo, debe utilizar la opción -I/--head. Muestra toda la información disponible sobre un solo archivo para HTTP y FTP. The HTTP information is a lot more extensive.

For HTTP, you can get the header information (the same as -I would show) shown before the data by using -i/--include. Curl understands the -D/--dump-header option when getting files from both FTP and HTTP, and it will then store the headers in the specified file.

Store the HTTP headers in a separate file (headers.txt in the example):

  curl --dump-header headers.txt curl.se

Tenga en cuenta que los encabezados almacenados en un archivo separado pueden ser útiles en un momento posterior si desea que curl use cookies enviadas por el servidor. Más sobre eso en la sección de cookies.

POST (HTTP)

Es fácil publicar datos usando curl. Esto se hace usando la opción -d <datos>. Los datos de la publicación deben estar codificados en URL.

Publique un libro de visitas simple de nombre y teléfono.

curl -d "nombre=Rafael%20Sagula&teléfono=3320780" http://www.where.com/guest.cgi

Cómo publicar un formulario con curl, lección #1:

Busque todas las etiquetas <input> en el formulario que desea completar.

Si hay una publicación normal, usa -d para publicar. -d toma una cadena de publicación completa, que tiene el formato

<variable1>=<dato1>&<variable2>=<dato2>&...

Los nombres de las variables son los nombres establecidos con "name=" en las etiquetas <input>, y los datos son los contenidos que desea completar para las entradas. Los datos deben estar correctamente codificados en URL. Eso significa que reemplaza el espacio con + y que reemplaza letras raras con %XX donde XX es la representación hexadecimal del código ASCII de la letra.

Ejemplo:

(página ubicada en http://www.formpost.com/getthis/)

<form action="post.cgi" method="post">
<input name=user size=10>
<input name=pass type=password size=10>
<input name=id type=hidden value="blablabla">
<input name=ding value="submit">
</form>

Queremos introducir el usuario foobar con la contraseña 12345.

Para enviar esto, se introduce una línea de comando curl como

curl -d "user=foobar&pass=12345&id=blablabla&ding=submit"
  http://www.formpost.com/getthis/post.cgi

Aunque -d utiliza el tipo mime application/x-www-form-urlencoded, generalmente entendido por los CGI y similares, curl también soporta el tipo multipart/form-data, más capaz. Este último tipo soporta cosas como la carga de archivos.

-F acepta parámetros como -F "name=contents". Si quiere que el contenido se lea de un archivo, utilice @nombredelarchivo como contenido. Cuando se especifica un archivo, también se puede especificar el tipo de contenido del archivo añadiendo ;type=<mime type> al nombre del archivo. También puede publicar el contenido de varios archivos en un solo campo. Por ejemplo, el nombre del campo coolfiles se utiliza para enviar tres archivos, con diferentes tipos de contenido utilizando la siguiente sintaxis

curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html"
  http://www.post.com/postit.cgi

Si no se especifica el tipo de contenido, curl tratará de adivinarlo a partir de la extensión del archivo (sólo conoce algunas), o utilizará el tipo especificado previamente (de un archivo anterior si se especifican varios archivos en una lista) o bien utilizará el tipo por defecto application/octet-stream.

Emular un formulario de relleno con -F. Supongamos que rellena tres campos en un formulario. Un campo es un nombre de archivo que se va a publicar, un campo es su nombre y un campo es una descripción del archivo. Queremos publicar el archivo que hemos escrito llamado cooltext.txt. Para dejar que curl haga la publicación de estos datos en lugar de tu navegador favorito, tienes que leer la fuente HTML de la página del formulario y encontrar los nombres de los campos de entrada. En nuestro ejemplo, los nombres de los campos de entrada son file, yourname y filedescription.

curl -F "file=@cooltext.txt" -F "yourname=Daniel"
  -F "filedescription=Archivo de texto genial con texto genial dentro"
  http://www.post.com/postit.cgi

Para enviar dos archivos en un solo mensaje puedes hacerlo de dos maneras:

Enviar varios archivos en un solo campo con un solo nombre de campo:

curl -F "pictures=@dog.gif,cat.gif" $URL

Enviar dos campos con dos nombres de campo

curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif" $URL

Para enviar el valor de un campo literalmente sin interpretar una @ o < iniciales, o un ;type= incrustado, utilice --form-string en lugar de -F. Esto se recomienda cuando el valor se obtiene de un usuario o de alguna otra fuente impredecible. En estas circunstancias, usar -F en lugar de --form-string podría permitir a un usuario engañar a curl para que cargue un archivo.

Referrer

Una petición HTTP tiene la opción de incluir información sobre la dirección que la ha remitido a la página actual. curl permite especificar el referrer que se utilizará en la línea de comandos. Resulta especialmente útil para engañar o engañar a servidores estúpidos o scripts CGI que dependen de que esa información esté disponible o contenga ciertos datos.

curl -e www.coolsite.com http://www.showme.com/

Agente de usuario

Una petición HTTP tiene la opción de incluir información sobre el navegador que ha generado la petición. Curl permite especificarla en la línea de comandos. Resulta especialmente útil para engañar o engañar a servidores estúpidos o scripts CGI que sólo aceptan determinados navegadores.

Ejemplo:

curl -A 'Mozilla/3.0 (Win95; I)' http://www.nationsbank.com/

Otras cadenas comunes:

  • Mozilla/3.0 (Win95; I) - Netscape Versión 3 para Windows 95
  • Mozilla/3.04 (Win95; U) - Netscape Versión 3 para Windows 95
  • Mozilla/2.02 (OS/2; U) - Netscape Versión 2 para OS/2
  • Mozilla/4.04 [es] (X11; U; AIX 4.2; Nav) - Netscape para AIX
  • Mozilla/4.05 [es] (X11; U; Linux 2.0.32 i586) - Netscape para Linux

Tenga en cuenta que Internet Explorer se esfuerza por ser compatible en todos los sentidos:

  • Mozilla/4.0 (compatible; MSIE 4.01; Windows 95) - MSIE para W95

Mozilla no es el único nombre posible de User-Agent:

  • Konqueror/1.0 - Cliente de escritorio KDE File Manager
  • Lynx/2.7.1 libwww-FM/2.14 - Navegador de línea de comandos Lynx

Cookies

Las cookies son utilizadas generalmente por los servidores web para mantener la información de estado en el lado del cliente. El servidor establece las cookies enviando una línea de respuesta en las cabeceras que se parece a Set-Cookie: <datos> donde la parte de los datos suele contener un conjunto de pares NAME=VALUE (separados por punto y coma; como NAME1=VALUE1; NAME2=VALUE2;). El servidor también puede especificar para qué ruta debe usarse la cookie (especificando path=value), cuándo debe expirar la cookie (expire=DATE), para qué dominio usarla (domain=NAME) y si debe usarse sólo en conexiones seguras (secure).

Si ha recibido una página de un servidor que contiene una cabecera como

Set-Cookie: sessionid=boo123; path="/foo";

significa que el servidor quiere que se pase ese primer par cuando recibamos cualquier cosa en una ruta que empiece por /foo.

Ejemplo, obtener una página que quiere que se le pase mi nombre en una cookie:

curl -b "name=Daniel" www.sillypage.com

cURL también tiene la capacidad de utilizar las cookies recibidas previamente en las siguientes sesiones. Si obtiene las cookies de un servidor y las almacena en un archivo de forma similar a

curl --dump-header headers www.example.com

Aunque guardar las cabeceras en un archivo es una forma de almacenar las cookies que funciona, es sin embargo propensa a errores y no es la forma preferida de hacerlo. En su lugar, haga que curl guarde las cookies entrantes utilizando el conocido formato de cookies de Netscape de la siguiente manera

curl -c cookies.txt www.example.com

Tenga en cuenta que especificando -b habilita el motor de cookies y con -L puede hacer que curl siga una ubicación: (que a menudo se utiliza en combinación con las cookies). Si un sitio envía cookies y un campo de ubicación, puede utilizar un archivo no existente para activar el conocimiento de las cookies como

curl -L -b empty.txt www.example.com

El archivo del que se van a leer las cookies debe estar formateado con cabeceras HTTP simples O como el archivo de cookies de Netscape. Curl determinará qué tipo es en función del contenido del archivo. En el comando anterior, curl analizará la cabecera y almacenará las cookies recibidas de www.example.com. curl enviará al servidor las cookies almacenadas que coincidan con la solicitud, ya que sigue la ubicación. El archivo empty.txt puede ser un archivo inexistente.

Para leer y escribir cookies desde un archivo de cookies de Netscape, puede configurar tanto -b como -c para utilizar el mismo archivo:

curl -b cookies.txt -c cookies.txt www.example.com

Medidor de progreso

El medidor de progreso existe para mostrar al usuario que algo está sucediendo realmente. Los diferentes campos en la salida tienen el siguiente significado:

% Total    % Received % Xferd  Average Speed          Time             Curr.
                               Dload  Upload Total    Current  Left    Speed
0  151M    0 38608    0     0   9406      0  4:41:43  0:00:04  4:41:39  9287

De izquierda a derecha:

  • % - porcentaje completado de toda la transferencia
  • Total - tamaño total de toda la transferencia prevista
  • % - porcentaje completado de la descarga
  • Received - cantidad de bytes descargados actualmente
  • % - porcentaje completado de la subida
  • Xferd - cantidad de bytes subidos actualmente
  • Average Speed Dload - la velocidad media de transferencia de la descarga
  • Average Speed Upload - la velocidad media de transferencia de la subida
  • Time total - tiempo previsto para completar la operación
  • Time Current - tiempo transcurrido desde la invocación
  • Time Left - tiempo previsto hasta la finalización de la operación
  • Curr.Speed - la velocidad media de transferencia de los últimos 5 segundos (los primeros 5 segundos de una transferencia se basan en menos tiempo, por supuesto).

La opción -# mostrará una barra de progreso totalmente diferente que no necesita mucha explicación.

Límite de velocidad

cURL permite al usuario establecer las condiciones de velocidad de transferencia que deben cumplirse para que la transferencia siga adelante. Utilizando el interruptor -y y -Y puede hacer que curl aborte las transferencias si la velocidad de transferencia está por debajo del límite mínimo especificado durante un tiempo determinado.

Para que curl aborte la descarga si la velocidad es inferior a 3000 bytes por segundo durante 1 minuto, ejecute

curl -Y 3000 -y 60 www.far-away-site.com

Esto puede usarse en combinación con el límite de tiempo global, de modo que la operación anterior debe completarse en su totalidad en 30 minutos:

curl -m 1800 -Y 3000 -y 60 www.far-away-site.com

También es posible forzar a curl a no transferir datos más rápido que una tasa determinada, lo que puede ser útil si está utilizando una conexión con un ancho de banda limitado y no quiere que su transferencia lo utilice todo (a veces se denomina estrangulamiento del ancho de banda).

Haga que curl no transfiera datos más rápido que 10 kilobytes por segundo:

curl --limit-rate 10K www.far-away-site.com

o

curl --limit-rate 10240 www.far-away-site.com

O impida que curl suba datos más rápido que 1 megabyte por segundo

curl -T upload --limit-rate 1M ftp://uploadshereplease.com

Cuando se utiliza la opción --limit-rate, la velocidad de transferencia se regula por segundos, lo que hará que la velocidad total de transferencia sea inferior al número dado. A veces, por supuesto, sustancialmente más baja, si su transferencia se detiene durante los períodos.

Archivo de configuración

Curl intenta leer automáticamente el archivo .curlrcp (o archivo _curlrc en sistemas Microsoft Windows) del directorio de inicio del usuario al iniciarse.

El archivo de configuración se puede hacer con los interruptores normales de la línea de comandos, pero también puede especificar las opciones largas sin los guiones para hacerlo más legible. Puede separar las opciones y el parámetro con espacios, o con = o :. Se pueden utilizar comentarios dentro del archivo. Si la primera letra de una línea es un símbolo #, el resto de la línea se trata como un comentario.

Si desea que el parámetro contenga espacios, debe encerrar todo el parámetro entre comillas dobles ("). Dentro de esas comillas, se especifica una comilla como \".

NOTA: Debe especificar las opciones y sus argumentos en la misma línea.

Ejemplo, establecer el tiempo de espera y el proxy por defecto en un archivo de configuración:

# Queremos un tiempo de espera de 30 minutos:
-m 1800
#. .. y usamos un proxy para todos los accesos:
proxy = proxy.nuestro.dominio.com:8080

Los espacios en blanco SON significativos al final de las líneas, pero todos los espacios en blanco que van hasta los primeros caracteres de cada línea son ignorados.

Evite que curl lea el archivo por defecto utilizando -q como primer parámetro de la línea de comandos, como

curl -q www.thatsite.com

Forzar a curl a obtener y mostrar una página de ayuda local en caso de que sea invocado sin URL haciendo un archivo de configuración similar a:

# url por defecto a obtener
url = "http://help.with.curl.com/curlhelp.html"

Puede especificar otro archivo de configuración para ser leído usando la bandera -K/--config. Si establece el nombre del archivo de configuración en -, leerá la configuración desde stdin, lo que puede ser útil si quiere ocultar las opciones para que no sean visibles en las tablas de procesos, etc:

echo "user = user:passwd" | curl -K - http://that.secret.site.com

Cabeceras extra

Cuando utilice curl en sus propios programas, puede terminar necesitando pasar sus propias cabeceras personalizadas cuando obtenga una página web. Puede hacerlo utilizando la bandera -H.

Por ejemplo, envíe la cabecera X-you-and-me: yes al servidor cuando obtenga una página:

curl -H "X-you-and-me: yes" www.love.com

Esto también puede ser útil en caso de que quiera que curl envíe un texto diferente en una cabecera de lo que normalmente hace. La cabecera -H que especifique sustituye entonces a la cabecera que curl enviaría normalmente. Si sustituye una cabecera interna por una vacía, impide que esa cabecera se envíe. Para evitar que se utilice la cabecera Host::

curl -H "Host:" www.server.com

FTP y nombres de ruta

Tenga en cuenta que cuando se obtienen archivos con una URL de ftp://, la ruta dada es relativa al directorio que introduzca. Para obtener el archivo README de su directorio principal en su sitio ftp, haga

curl ftp://user:passwd@my.site.com/README

Si quieres el archivo README del directorio raíz de ese mismo sitio, debes especificar el nombre absoluto del archivo:

curl ftp://user:passwd@my.site.com//README

(es decir, con una barra extra delante del nombre del archivo).

SFTP y SCP y nombres de ruta

Con sftp: y scp: el nombre de la ruta dada es el nombre absoluto en el servidor. Para acceder a un archivo relativo al directorio raíz del usuario remoto, anteponga al archivo el prefijo /~/ , como por ejemplo

curl -u $USER sftp://home.example.com/~/.bashrc

FTP y cortafuegos

El protocolo FTP requiere que una de las partes involucradas abra una segunda conexión en cuanto los datos estén a punto de ser transferidos. Hay dos maneras de hacer esto.

La forma predeterminada para curl es emitir el comando PASV que hace que el servidor abra otro puerto y espere otra conexión realizada por el cliente. Esto es bueno si el cliente está detrás de un firewall que no permite conexiones entrantes.

curl ftp.download.com

Si el servidor, por ejemplo, está detrás de un firewall que no permite conexiones en puertos diferentes al 21 (o si simplemente no soporta el comando PASV), la otra forma de hacerlo es usar el comando PORT e instruir al servidor para que se conecte con el cliente en el número de IP y puerto dados (como parámetros del comando PORT).

La bandera -P de curl admite algunas opciones diferentes. Su máquina puede tener varias direcciones IP y/o interfaces de red y curl le permite seleccionar cuál de ellas utilizar. También se puede utilizar la dirección por defecto:

curl -P - ftp.download.com

Descargue con PORT pero utilice la dirección IP de nuestra interfaz le0 (esto no funciona en windows):

curl -P le0 ftp.download.com

Descargar con PORT pero utilizar 192.168.0.10 como nuestra dirección IP a utilizar:

curl -P 192.168.0.10 ftp.download.com

Interfaz de red

Obtener una página web de un servidor usando un puerto especificado para la interfaz:

curl --interface eth0:1 http://www.example.com/

o

curl --interface 192.168.1.10 http://www.example.com/

HTTPS

El HTTP seguro requiere que se instale y utilice una biblioteca TLS cuando se construya curl. Si se hace esto, curl es capaz de recuperar y publicar documentos utilizando el protocolo HTTPS.

Ejemplo:

curl https://www.secure-site.com

curl también es capaz de utilizar certificados de cliente para obtener/publicar archivos de sitios que requieren certificados válidos. El único inconveniente es que el certificado debe estar en formato PEM. PEM es un formato estándar y abierto para almacenar certificados, pero no es utilizado por los navegadores más comunes. Si quieres que curl utilice los certificados que usas con tu navegador favorito, puede que necesites descargar/compilar un conversor que pueda convertir los certificados con formato de tu navegador a formato PEM.

Ejemplo de cómo recuperar automáticamente un documento utilizando un certificado con una contraseña personal:

curl -E /path/to/cert.pem:contraseña https://secure.site.com/

Si se olvida de especificar la contraseña en la línea de comandos, se le pedirá la contraseña correcta antes de poder recibir cualquier dato.

Muchos servidores HTTPS antiguos tienen problemas con versiones específicas de SSL o TLS, que las versiones más nuevas de OpenSSL etc. utilizan, por lo que a veces es útil especificar qué versión de TLS debe utilizar curl.:

curl --tlv1.0 https://secure.site.com/

De lo contrario, curl intentará utilizar una versión por defecto de TLS que sea razonable.

Reanudación de las transferencias de archivos

Para continuar una transferencia de archivos donde fue previamente abortada, curl soporta la reanudación en descargas HTTP(S) así como en cargas y descargas FTP.

Continúe la descarga de un documento:

curl -C - -o archivo ftp://ftp.server.com/path/file

Continuar la subida de un documento:

curl -C - -T archivo ftp://ftp.server.com/path/file

Seguir descargando un documento de un servidor web

curl -C - -o archivo http://www.server.com/

Condiciones de tiempo

HTTP permite a un cliente especificar una condición de tiempo para el documento que solicita. Se trata de If-Modified-Since o If-Unmodified-Since. curl permite especificarlas con la bandera -z/--time-cond.

Por ejemplo, puede hacer fácilmente una descarga que sólo se realice si el archivo remoto es más reciente que una copia local. Se haría como

curl -z local.html http://remote.server.com/remote.html

O puede descargar un archivo sólo si el archivo local es más nuevo que el remoto. Para ello, anteponga a la cadena de fecha un -, como en

curl -z -local.html http://remote.server.com/remote.html

Puede especificar una fecha en texto plano como condición. Dígale a curl que sólo descargue el archivo si se ha actualizado desde el 12 de enero de 2012:

curl -z "Jan 12 2012" http://remote.server.com/remote.html

curl acepta una amplia gama de formatos de fecha. Siempre se puede hacer la comprobación de la fecha al revés, anteponiendo un guión (-).

DICT

Para divertirse, pruebe con

curl dict://dict.org/m:curl
curl dict://dict.org/d:heisenbug:jargon
curl dict://dict.org/d:daniel:gcide

Los alias para m son match y find, y los alias para d son define y lookup. Por ejemplo,

curl dict://dict.org/find:curl

Los comandos que rompen la descripción de la URL de la RFC (pero no el protocolo DICT) son

curl dict://dict.org/show:db
curl dict://dict.org/show:strat

Sigue faltando soporte para la autenticación

LDAP

Si ha instalado la biblioteca OpenLDAP, curl puede aprovecharla y ofrecer soporte ldap://. En Windows, curl utilizará WinLDAP del SDK de la plataforma por defecto.

La versión de protocolo por defecto utilizada por curl es la versión 3 de LDAP. La versión 2 se utilizará como mecanismo de reserva en caso de que la versión 3 no pueda conectarse.

LDAP es una cosa compleja y escribir una consulta LDAP no es una tarea fácil. Te aconsejo que busques la descripción de la sintaxis para ello en otro lugar. Uno de esos lugares podría ser RFC 2255, The LDAP URL Format

Para mostrarte un ejemplo, así es como puedo obtener todas las personas de mi servidor LDAP local que tienen un determinado subdominio en su dirección de correo electrónico:

curl -B "ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se"

Si quiero la misma información en formato HTML, puedo obtenerla sin usar la bandera -B (enforce ASCII).

También puede utilizar la autenticación al acceder al catálogo LDAP:

curl -u usuario:passwd "ldap://ldap.frontec.se/o=frontec??sub?mail=*"
curl "ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*"

Por defecto, si se proporciona el usuario y la contraseña, OpenLDAP/WinLDAP utilizará la autenticación básica. En Windows puede controlar este comportamiento proporcionando una de las opciones --basic, --ntlm o --digest en la línea de comandos de curl

curl --ntlm "ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*"

En Windows, si no se especifica el usuario/contraseña, se utilizará el mecanismo de autenticación con las credenciales de inicio de sesión actuales (SSPI/SPNEGO).

Variables de entorno

Curl lee y entiende las siguientes variables de entorno:

http_proxy, HTTPS_PROXY, FTP_PROXY

Deben establecerse para los proxies específicos del protocolo. El proxy general debe establecerse con

ALL_PROXY

Se establece una lista separada por comas de nombres de hosts que no deben pasar por ningún proxy (sólo un asterisco, * coincide con todos los hosts)

NO_PROXY

Si el nombre del host coincide con una de estas cadenas, o el host está dentro del dominio de una de estas cadenas, las transacciones con ese nodo no se harán a través de proxy. Cuando se utiliza un dominio, éste debe comenzar con un punto. Un usuario puede especificar que tanto www.example.com como foo.example.com no deben utilizar un proxy estableciendo NO_PROXY a .example.com. Incluyendo el nombre completo se pueden excluir nombres de host específicos, así que para hacer que www.example.com no use un proxy pero que foo.example.com lo haga, establezca NO_PROXY a www.example.com.

El uso de la bandera -x/--proxy anula las variables de entorno.

Netrc

Unix introdujo el concepto de .netrc hace mucho tiempo. Es una forma de que un usuario especifique el nombre y la contraseña de los sitios FTP más visitados en un archivo para no tener que escribirlos cada vez que visite esos sitios. Te das cuenta de que esto es un gran riesgo para la seguridad si alguien se hace con tus contraseñas, por lo que la mayoría de los programas Unix no leerán este archivo a menos que sólo lo puedas leer tú (aunque a curl no le importa).

Curl soporta archivos .netrc si se le indica (usando las opciones -n/--netrc y --netrc-opcional). Esto no está restringido sólo a FTP, por lo que curl puede utilizarlo para todos los protocolos en los que se utiliza la autenticación.

Un simple archivo .netrc podría ser algo así

machine curl.se login iammanu password mysecret

Salida personalizada

Para permitir a los programadores de scripts conocer mejor el progreso de curl, se introdujo la opción -w/--write-out. Con ella se puede especificar qué información de la transferencia anterior se quiere extraer.

Para mostrar la cantidad de bytes descargados junto con algún texto y una nueva línea final:

curl -w 'We downloaded %{size_download} bytes\n' www.download.com

Transferencia FTP Kerberos

Curl soporta kerberos4 y kerberos5/GSSAPI para transferencias FTP. Necesitas el paquete kerberos instalado y usado en el momento de construir Curl para que esté disponible.

Primero, obtenga el krb-ticket de la manera normal, como con la herramienta kinit/kauth. Luego use curl de manera similar a

curl --krb private ftp://krb4site.com -u username:fakepwd

No hay necesidad de una contraseña en el interruptor -u, pero una en blanco hará que curl pida una y ya has introducido la contraseña real a kinit/kauth.

TELNET

El soporte de curl para telnet es básico y fácil de usar. Curl pasa todos los datos que se le pasan en stdin al servidor remoto. Conéctese a un servidor telnet remoto utilizando una línea de comandos similar a

curl telnet://remote.server.com

E introduzca los datos a pasar al servidor en stdin. El resultado se enviará a stdout o al archivo que especifiques con -o .

Puede que quieras la opción -N/--no-buffer para desactivar la salida en buffer para conexiones lentas o similares.

Pasar opciones a la negociación del protocolo telnet, utilizando la opción -t. Para decirle al servidor que usamos una terminal vt100, intente algo como

curl -tTTYPE=vt100 telnet://remote.server.com

Otras opciones interesantes para -t son

  • XDISPLOC=<X display> Establece la ubicación de la pantalla X.
  • NEW_ENV=<var,val> Establece una variable de entorno.

NOTA: El protocolo telnet no especifica ninguna forma de iniciar sesión con un usuario y una contraseña específicos, por lo que curl no puede hacerlo automáticamente. Para hacer eso, necesita rastrear cuando se recibe el prompt de login y enviar el nombre de usuario y la contraseña en consecuencia.

Conexiones persistentes

Especificar múltiples archivos en una sola línea de comandos hará que curl los transfiera todos, uno tras otro en el orden especificado.

libcurl intentará utilizar conexiones persistentes para las transferencias, de forma que la segunda transferencia al mismo host pueda utilizar la misma conexión que ya se inició y se dejó abierta en la transferencia anterior. Esto disminuye en gran medida el tiempo de conexión para todas las transferencias, excepto la primera, y hace un uso mucho mejor de la red.

Tenga en cuenta que curl no puede utilizar conexiones persistentes para las transferencias que se utilizan en posteriores invocaciones de curl. Intente rellenar tantas URLs como sea posible en la misma línea de comandos si están usando el mismo host, ya que eso hará que las transferencias sean más rápidas. Si utiliza un proxy HTTP para las transferencias de archivos, prácticamente todas las transferencias serán persistentes.

Múltiples transferencias con una sola línea de comandos

Como se ha mencionado anteriormente, puedes descargar múltiples archivos con una sola línea de comandos simplemente añadiendo más URLs. Si quieres que se guarden en un archivo local en lugar de imprimirse en la salida estándar, tienes que añadir una opción de guardado para cada URL que especifiques. Tenga en cuenta que esto también se aplica a la opción -O (pero no a --remote-name-all).

Por ejemplo: obtenga dos archivos y utilice -O para el primero y un nombre de archivo personalizado para el segundo:

curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg

También puede cargar varios archivos de forma similar:

curl -T local1 ftp://ftp.com/moo.exe -T local2 ftp://ftp.com/moo2.txt

IPv6

cURL se conectará a un servidor con IPv6 cuando una búsqueda de host devuelva una dirección IPv6 y volverá a IPv4 si la conexión falla. Las opciones --ipv4 y --ipv6 pueden especificar qué dirección usar cuando ambas están disponibles. Las direcciones IPv6 también pueden especificarse directamente en las URLs utilizando la sintaxis

http://[2001:1890:1112:1::20]/overview.html

Cuando se utiliza este estilo, debe darse la opción -g para evitar que curl interprete los corchetes como caracteres especiales de globbing. También se pueden utilizar direcciones locales de enlace y locales de sitio que incluyan un identificador de ámbito, como fe80::1234%1, pero la parte de ámbito debe ser numérica o coincidir con una interfaz de red existente en Linux y el carácter de porcentaje debe escaparse de la URL. El ejemplo anterior en una URL SFTP podría tener el siguiente aspecto

sftp://[fe80::1234%251]/

Las direcciones IPv6 proporcionadas que no sean en URLs (por ejemplo, a las opciones --proxy, --interface o --ftp-port) no deben ser codificadas en URL.

Listas de correo

Para tu comodidad, tenemos varias listas de correo abiertas para discutir sobre curl, su desarrollo y cosas relevantes para esto. Obtenga toda la información en https://curl.se/mail/.

Por favor, dirija las preguntas sobre curl, las peticiones de características y los informes de problemas a una de estas listas de correo en lugar de enviarlas a cualquier persona.

Las listas disponibles son

curl-users

Usuarios de la herramienta de línea de comandos. Cómo usarla, qué no funciona, nuevas características, herramientas relacionadas, preguntas, noticias, instalaciones, compilaciones, ejecución, portación, etc.

curl-library

Desarrolladores que utilizan o desarrollan libcurl. Bugs, extensiones, mejoras. curl-announce

Poco tráfico. Sólo recibe anuncios de nuevas versiones públicas. En el peor de los casos, eso hace algo así como uno o dos correos al mes, pero normalmente sólo un correo cada dos meses.

curl-y-php

Usando las funciones de curl en PHP. Todo curl con un ángulo de PHP. O PHP con un ángulo de curl.

curl-y-python

Hackers de Python usando curl con o sin el enlace pycurl de python.

Traducción

Manuel