wiki/HowtocURL.md

212 lines
4.7 KiB
Markdown
Raw Normal View History

2016-10-06 11:04:37 +02:00
---
2017-04-12 09:36:46 +02:00
title: Howto curl
2016-10-06 11:04:37 +02:00
categories: tips
...
2017-04-12 09:31:29 +02:00
* Site officiel : <https://curl.haxx.se/>
* Page de manuel : <https://curl.haxx.se/docs/manpage.html>
* Code source : <https://github.com/curl/curl/>
2017-03-17 17:00:17 +01:00
2017-04-12 09:36:46 +02:00
**curl** est un outil s'appuyant sur une bibliothèque (libcurl) pour transférer des données à l'aide de différents protocoles. Il peut être utilisé en ligne de commande ou via des scripts. Il support une multitude de protocoles parmi lesquels HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3, SSCP, SFTP, SMB, SMTP, SMTPS, Telnet…
2017-03-17 17:00:17 +01:00
## Utilisation de base
Récupérer et afficher sur la sortie standard le contenu d'une ressource :
2017-03-17 17:00:17 +01:00
~~~
$ curl https://www.example.com
~~~
2017-03-27 14:52:19 +02:00
Enregistrer la ressource dans un fichier portant le même nom (`-O` ou `--remote-name`) :
2017-03-17 17:00:17 +01:00
~~~
$ curl -O https://www.example.com/page.html
2017-03-17 17:00:17 +01:00
~~~
Ne pas vérifier la validité du certificat (`-k` ou `--insecure`) :
2017-03-17 17:00:17 +01:00
~~~
$ curl -k https://www.example.com/
~~~
Suivre les redirections (`-L` ou `--location`) :
2017-03-17 17:00:17 +01:00
~~~
$ curl -L http://www.example.com
~~~
Spécifier la méthode (par défaut GET) POST/PUT/DELETE (`-X` ou `--request`) :
2017-03-17 17:00:17 +01:00
~~~
$ curl -X POST https://www.example.com
~~~
2017-04-12 09:34:19 +02:00
**Attention**, cette option se contente de modifier le verbe HTTP indiqué dans l'en-tête de la requête et ne modifie pas du tout le comportement de curl vis-à-vis de la réponse. Pour en savoir plus sur les bons et mauvais usages de cette options : <https://daniel.haxx.se/blog/2015/09/11/unnecessary-use-of-curl-x/>
Spécifier un en-tête HTTP (`-H` ou `--header`) :
~~~
$ curl http://www.example.com -H 'Accept: text/plain'
~~~
2017-04-10 15:42:47 +02:00
Spécifier un user-agent :
~~~
$ curl -A "Mozilla/5.0 (compatible; evolix; http://evolix.com)" http://example.com
~~~
2016-10-06 11:04:37 +02:00
## Outrepasser le nom de domaine
2017-03-17 17:00:17 +01:00
Avec cette astuce, inutile de modifier `/etc/hosts`, ce qui est très pratique.
2016-10-06 11:04:37 +02:00
Avec un en-tête `Host` forcé :
2016-10-06 11:04:37 +02:00
2017-01-20 10:51:37 +01:00
~~~
2016-10-06 11:04:37 +02:00
$ curl http://192.0.2.1:8080/foo/bar -H 'Host: www.example.com'
2017-01-20 10:51:37 +01:00
~~~
2016-10-06 11:04:37 +02:00
Avec une résolution forcée (`--resolve`, à partir de 7.21.3) :
2016-10-06 11:04:37 +02:00
2017-01-20 10:51:37 +01:00
~~~
2016-10-06 11:04:37 +02:00
$ curl --resolve www.example.com:443:192.0.2.1 https://www.example.com/foo/bar
2017-01-20 10:51:37 +01:00
~~~
2016-10-06 11:04:37 +02:00
2017-03-17 17:00:17 +01:00
## Authentification
Option `-u` ou `--user` :
2017-03-17 17:00:17 +01:00
~~~
$ curl -u username:password https://www.example.com
~~~
## SMTP
Envoyer un email :
~~~
$ curl --mail-from foo@example.com --mail-rcpt bar@example.com smtp://example.com/
~~~
## FTP
Récupérer le fichier Debian.iso via FTP :
~~~
$ curl -u ftpuser:ftppass -O ftp://ftp.example.com/foo/bar/Debian.iso
~~~
Lister le contenu d'un dossier :
~~~
$ curl ftp://ftp.example.com/foo/bar/
~~~
Envoyer des fichiers :
~~~
$ curl -u ftpuser:ftppass -T fichier ftp://ftp.example.com/
$ curl -u ftpuser:ftppass -T "{fichier1,fichier2}" ftp://ftp.example.com/
~~~
## API REST
Pour tester des interactions avec une API REST, on peut facilement envoyer des structures de données.
En direct :
~~~
$ curl -XPUT 'http://localhost:9200/_snapshot/foo' -d '{
"type": "fs",
"settings": {
"location": "/home/backup-elasticsearch",
"compress": true
}
}'
~~~
Via un fichier :
~~~
$ curl -XPUT 'http://localhost:9200/_snapshot/foo' -d @/path/to/file
~~~
2016-10-06 11:04:37 +02:00
## Divers
### Affichage de la réponse
Afficher uniquement les en-têtes (`-I` ou `--head`) :
2016-10-06 11:04:37 +02:00
2017-01-20 10:51:37 +01:00
~~~
2016-10-06 11:04:37 +02:00
$ curl -I www.example.com
2017-03-08 20:12:55 +01:00
~~~
Afficher les en-têtes et le contenu (`-i` ou `--include`) :
2017-03-08 20:22:28 +01:00
~~~
$ curl -i www.example.com
~~~
### En-têtes de requête et de réponse
À plaver dans un script, pour faciliter son utilisation.
*Note*: Ce script permet de ne pas modifier le verbe HTTP employé. En effet, une requête "HEAD" peut-être traitée différemment d'un "GET" par certains services. Il peut être combiné avec toutes les options de Curl.
~~~{.bash}
#!/bin/sh
#
# https://github.com/rtomayko/dotfiles/blob/rtomayko/bin/headers
curl -sv "$@" 2>&1 >/dev/null |
grep -v "^\*" |
grep -v "^}" |
cut -c3-
~~~
~~~
$ ~/bin/headers http://www.example.com
GET / HTTP/1.1
User-Agent: curl/7.38.0
Host: www.example.com
Accept: */*
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html
Date: Mon, 27 Mar 2017 12:39:35 GMT
Etag: "359670651"
Expires: Mon, 03 Apr 2017 12:39:35 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (lga/13D5)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1270
[data not shown]
~~~
### Version compressée
Obtenir le contenu gzipé (avec un en-tête forcé) :
2017-03-08 20:12:55 +01:00
~~~
$ curl www.example.com -H 'Accept-Encoding:gzip, deflate'
2017-03-08 20:22:28 +01:00
~~~
2017-03-17 17:00:17 +01:00
### Contrainte de date de modification de la ressource
Récupérer le contenu seulement si celui-ci a été modifié après le 17 Mars 2017 (`-I` ou `--head`) :
2017-03-17 17:00:17 +01:00
~~~
$ curl -z 17-Mar-17 www.example.com
~~~
Récupérer le contenu seulement si celui-ci a été modifié avant le 17 Mers 2017 :
~~~
$ curl -z -17-Mar-17 www.example.com
~~~