Featured image of post Uso de curl

Uso de curl

El comando _curl_ esta diseñado para verificar una url y ademas permite la transferencia de datos. Hace uso de la librería opensource _libcurl_ disponible en todas las distribuciones Linux.

El comando curl esta diseñado para verificar una url y ademas permite la transferencia de datos. Hace uso de la librería opensource libcurl disponible en todas las distribuciones Linux.

El comando Curl es compatible con la siguiente lista de protocolos:

  • HTTP y HTTPS
  • FTP y FTPS
  • IMAP e IMAPS
  • POP3 y POP3S
  • SMB y SMBS
  • SFTP
  • SCP
  • TELNET
  • GOPHER
  • LDAP y LDAPS
  • SMTP y SMTPS

Operaciones básicas

La sintaxis básica del comando es la siguiente:

1
curl [OPTIONS] [URL]

Algunas de las opciones mas relevantes son:

  • -#, –progress-bar Make curl display a simple progress bar instead of the more informational standard meter.
  • -b, –cookie <name=data> Supply cookie with request. If no =, then specifies the cookie file to use (see -c).
  • -c, –cookie-jar File to save response cookies to.
  • -d, –data Send specified data in POST request. Details provided below.
  • -f, –fail Fail silently (don’t output HTML error form if returned).
  • -F, –form <name=content> Submit form data.
  • -H, –header
    Headers to supply with request.
  • -i, –include Include HTTP headers in the output.
  • -I, –head Fetch headers only.
  • -k, –insecure Allow insecure connections to succeed.
  • -L, –location Follow redirects.
  • -o, –output Write output to . Can use –create-dirs in conjunction with this to create any directories specified in the -o path.
  • -O, –remote-name Write output to file named like the remote file (only writes to current directory).
  • -s, –silent Silent (quiet) mode. Use with -S to force it to show errors.
  • -v, –verbose Provide more information (useful for debugging).
  • -w, –write-out Make curl display information on stdout after a completed transfer. See man page for more details on available variables. Convenient way to force curl to append a newline to output: -w “\n” (can add to ~/.curlrc).
  • -X, –request The request method to use.

Se puede realizar la peticion por una IP o un interfaz especifico con el flag –interface:

1
2
3
curl --interface eth0:1 http://host.com/

curl --interface 192.168.1.10 http://host.com/

HTTP con curl

Es posible reanudar una descarga interrumpida con el siguiente comando:

1
curl -C - -O  http://host.com/file.tar

Podemos limitar la velocidad de descarga con:

1
curl --limit-rate 200k -O http://host.com/file.tar

Gestión certificados

Podemos verificar un certificado SSL con:

1
$ curl --cacert cacert.crt http://host.com

Podemos ignorar certificado SSL con:

1
curl -k http://host.com

User Agent

Podemos indicar un User-Agent especifico con el flag -A:

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

Aquí hay una lista de User-Agent validos:

1
2
3
4
Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15

Customize headers

Podemos modificar las cabeceras con el flag -H:

1
2
curl -H "Host: test.example" http://host.com/
curl -H "User-Agent:" http://host.com/

Referer

Podemos indicar que estamos realizando una referencia de otra url con el flag –referer:

1
curl --referer http://comes-from.example.com https://host.com/

Proxy con autenticación

Podemos indicar un proxy y las credenciales si son necesarias para el proxy con el flag -u:

1
curl PROXY:8000 -u username:password -O http://host.com/file.tar

Si el proxy requiere una autenticación especifica, habría que usar el flag -U:

1
curl PROXY:8000 -U username:password -O http://host.com/file.tar

Cookies

Podemos navegar usando unas cookies previamente descargadas:

1
curl --cookie-jar cookie.txt https://www.host.com/index.html

GET

Para usar el método GET basta con usar el comando:

1
curl http://localhost:5000

POST

Para usar el método POST hay que usar -X POST. Es necesario indicar el campo data y opcionalmente se puede enviar el Content-Type.

Formas de enviar datos:

1
2
form urlencoded: -d "param1=value1&param2=value2" or -d @data.txt
json: -d '{"key1":"value1", "key2":"value2"}' or -d @data.json

El formato para enviar un POST con un JSON con los flags en formato largo sería:

1
2
3
4
curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"abc","password":"xyz"}' \
  http://localhost:5000

El mismo comando pero en formato corto sería:

1
2
3
4
curl -H "Content-Type: application/json" \
  -X POST \
  -d '{"username":"abc","password":"xyz"}' \
  http://localhost:5000

Para enviar un fichero en vez de un string se usa el data @fichero:

1
2
3
4
curl -H "Content-Type: application/json" \
  -X POST \
  -d '@example.json' \
  http://localhost:5000

Para enviar un POST con Content-Type www-form podemos ponerlo en el flag -H o eliminarlo, ya que es el Content-Type por defecto en curl.

1
2
3
4
curl -H "Content-Type: application/x-www-form-urlencoded" \
  -X POST \
  -d 'username=abc&password=xyz' \
  http://localhost:5000

PUT

El proceso es el mismo que con POST.

1
2
3
4
curl -H "Content-Type: application/json" \
  -X PUT \
  -d '{"username":"abc","password":"xyz"}' \
  http://localhost:5000
1
2
3
4
curl -H "Content-Type: application/x-www-form-urlencoded" \
  -X PUT \
  -d 'username=abc&password=xyz' \
  http://localhost:5000

DELETE

Podemos borrar un fichero con el comando:

1
curl -X "DELETE" http://localhost:5000/file

PATCH

1
curl -X PATCH http://localhost:5000/file?status=closed

MOVE

Podemos mover un fichero con el comando:

1
curl -X MOVE --header 'Destination:http://host.org/new.txt' 'https://host.com/old.txt'

OPTIONS

Podemos ver los métodos que están permitidos en un servidor HTTP con el comando:

1
curl -X OPTIONS http://localhost:5000 -i

MKCOL

Podemos crear un directorio con el comando:

1
curl -X MKCOL 'https://example.com/new_folder'

FTP/FTPS/SFTP/SCP con curl

Descarga

Podemos descargar ficheros de un servidores FTP con los comandos:

1
2
3
4
curl -u username:password -O ftp://server_ftp/test.tar.gz

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

También podemos descargar ficheros de servidores SSH usando SFTP o SCP con los siguientes comandos:

1
2
3
4
5
6
7
curl -u username sftp://example.com/etc/issue

# Clave prinvada sin contraseña
curl -u username: --key ~/.ssh/id_rsa scp://example.com/~/file.txt

# Clave privada con contraseña
curl -u username: --key ~/.ssh/id_rsa --pass private_key_password scp://example.com/~/file.txt

Subida

También es posible subir ficheros al servidor FTP con el flag -T:

1
curl -u username:password -T test.tar.gz ftp://server_ftp

SMB con curl

Podemos descargar ficheros de un servidor SMB con el comando:

1
curl -u "domain\username:password" smb://server.example.com/share/file.txt

También es posible subir ficheros al servidor SMB con el flag -T:

1
curl -T file.txt -u "domain\username:passwd" smb://server.example.com/share/

LDAP/LDAPS con curl

Si se tiene instalada la librería OpenLDAP, es posible usar curl para real;izar peticiones utilizando el protocolo ldap://. Por defecto se usará LDAPv3 y en caso de que este falle se usará LDAPv2.

La sintaxis de una consulta con LDAP es algo compleja, para obtener ayuda seria relevante usar el RFC 2255

Algunos ejemplos de consultas son las siguientes:

1
2
3
4
5
6
7
8
9
# LDAP sin autenticación
curl -B "ldap://ldap.frontec.se/o=frontec??sub?mail=*sth.frontec.se"

# LDAP con autenticación
curl -u user:passwd "ldap://ldap.frontec.se/o=frontec??sub?mail=*"
curl "ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*"

# Por defecto se usa autenticacion basica. --basic, --ntlm o --digest
curl --ntlm "ldap://user:passwd@ldap.frontec.se/o=frontec??sub?mail=*"

Fuentes: 0, 1, 2

comments powered by Disqus
Esto es el footer
Creado con Hugo
Tema Stack diseñado por Jimmy