relecture

This commit is contained in:
gcolpart 2017-05-18 12:15:55 +02:00
parent 6ab8a59620
commit 9a2ee994f7

View file

@ -3,153 +3,102 @@ title: Howto curl
categories: tips
...
* Site officiel : <https://curl.haxx.se/>
* Page de manuel : <https://curl.haxx.se/docs/manpage.html>
* Code source : <https://github.com/curl/curl/>
**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…
[curl](https://curl.haxx.se/) est un client [HTTP](HowtoHTTP) [libre](https://github.com/curl/curl/) en ligne de commande. Il supporte aussi d'autres protocoles (HTTPS, IMAP(S), LDAP(S), POP3(S), SSCP, SFTP, SMB, SMTP(S) etc.). Il est également intégré à de nombreux langages (PHP, Python, Ruby, Perl, etc. sous forme de bibliothèque (*libcurl*).
## Utilisation de base
Récupérer et afficher sur la sortie standard le contenu d'une ressource :
Pour récupérer et afficher sur la sortie standard le contenu d'une ressource :
~~~
$ curl https://www.example.com
~~~
Enregistrer la ressource dans un fichier portant le même nom (`-O` ou `--remote-name`) :
~~~
$ curl -O https://www.example.com/page.html
~~~
Ne pas vérifier la validité du certificat (`-k` ou `--insecure`) :
~~~
$ curl -k https://www.example.com/
~~~
Suivre les redirections (`-L` ou `--location`) :
~~~
$ curl -L http://www.example.com
~~~
Spécifier la méthode (par défaut GET) POST/PUT/DELETE (`-X` ou `--request`) :
~~~
$ curl -X POST https://www.example.com
~~~
**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'
~~~
Spécifier un user-agent (`-A` ou `--user-agent`) :
~~~
$ curl -A "Mozilla/5.0 (compatible; evolix; http://evolix.com)" http://example.com
~~~
## Outrepasser le nom de domaine
Avec cette astuce, inutile de modifier `/etc/hosts`, ce qui est très pratique.
Avec un en-tête `Host` forcé (ne gère pas le SNI) :
~~~
$ curl http://192.0.2.1:8080/foo/bar -H 'Host: www.example.com'
~~~
Avec une résolution forcée (`--resolve`, à partir de 7.21.3, gère le SNI) :
~~~
$ curl --resolve www.example.com:443:192.0.2.1 https://www.example.com/foo/bar
~~~
## Authentification
Option `-u` ou `--user` :
~~~
$ 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
~~~
## Divers
### Affichage de la réponse
Afficher uniquement les en-têtes (`-I` ou `--head`) :
Pour faire une requête HEAD et donc afficher uniquement les entêtes de la réponse, utiliser l'option `-I` (ou `--head`) :
~~~
$ curl -I www.example.com
~~~
Afficher les en-têtes et le contenu (`-i` ou `--include`) :
Pour enregistrer la ressource dans un fichier portant le même nom, utiliser l'option `-O` (ou `--remote-name`) :
~~~
$ curl -i www.example.com
$ curl -O https://www.example.com/page.html
~~~
Dans le cas d'un protocole s'appuyant sur SSL/TLS, pour ne pas vérifier la validité du certificat on ajoute l'option `-k` (ou `--insecure`) :
~~~
$ curl -k https://www.example.com/
~~~
Par défaut, curl ne suit pas les redirections HTTP, il faut l'option `-L` (ou `--location`) :
~~~
$ curl -L http://www.example.com
~~~
Pour spécifier un User-Agent, `-A` ou `--user-agent`) :
~~~
$ curl -A "Mozilla/5.0 (compatible; evolix; http://evolix.com)" http://example.com
~~~
Plus généralement, pour spécifier un entête HTTP utiliser l'option `-H` (ou `--header`) :
~~~
$ curl http://www.example.com -H 'Accept: text/plain'
~~~
## Forcer la résolution DNS
Lorsque l'on fait des tests, on a souvent besoin de forcer la résolution d'un enregistrement DNS vers une adresse IP spécifique.
L'astuce classique est de modifier le fichier HOSTS (`/etc/hosts` sous Linux et BSD) mais cela n'est pas très pratique pour diverses raisons (nécessite un accès _root_, cela change pour toutes les machines, il peut y avoir du cache).
Première astuce possible, modifier l'entête `Host` :
~~~
$ curl http://192.0.2.1:8080/foo/bar -H 'Host: www.example.com'
~~~
...les inconvénients sont qu'il faut modifier l'URL pour mettre l'adresse IP (ce qui ne permet pas de faire des copier/coller facilement) et que cela ne gère par le SNI (dans le cas de la couche SSL/TLS).
Une seconde astuce est d'utiliser l'option `--resolve` (à partir de curl 7.21.3) :
~~~
$ curl --resolve www.example.com:443:192.0.2.1 https://www.example.com/foo/bar
~~~
## Utilisation avancée
Pour envoyer une authentification HTTP, préciser l'option `-u` (ou `--user`) :
~~~
$ curl -u jdoe:PASSWORD https://www.example.com
~~~
Pour spécifier la méthode HTTP POST/PUT/DELETE (par défaut GET), cela se fait avec l'option `-X` (ou `--request`) :
~~~
$ curl -X POST https://www.example.com
~~~
**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 option : <https://daniel.haxx.se/blog/2015/09/11/unnecessary-use-of-curl-x/>
Pour afficher les entêtes **et** le contenu, utiliser l'option `-i` (ou `--include`) :
~~~
$ curl -i https://www.example.com
~~~
### En-têtes de requête et de réponse
À plaver dans un script, pour faciliter son utilisation.
À placer 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.
@ -188,28 +137,84 @@ Content-Length: 1270
[data not shown]
~~~
### Interactions avec une 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
~~~
### Version compressée
Obtenir le contenu gzipé (avec un en-tête forcé) :
Pour obtenir le contenu gzipé (avec un entête HTTP forcé) :
~~~
$ curl www.example.com -H 'Accept-Encoding:gzip, deflate'
~~~
### Contrainte de date de modification de la ressource
### If-(M|Unm)odified-Since : contrainte sur la date de modification
Récupérer le contenu seulement si celui-ci a été modifié après le 17 Mars 2017 (`-z` ou `--time-cond`) :
Pour préciser l'entête HTTP `If-Modified-Since` et récupérer le contenu seulement si celui-ci a été modifié après le 17 Mars 2017, utiliser l'option (`-z` ou `--time-cond`) :
~~~
$ curl -z 17-Mar-17 www.example.com
$ curl -z 17-Mar-17 https://www.example.com
~~~
Récupérer le contenu seulement si celui-ci a été modifié avant le 17 Mers 2017 :
Pour préciser l'entête HTTP `If-Unmodified-Since` et 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
$ curl -z -17-Mar-17 https://www.example.com
~~~
## Autres protocoles
### 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 jdoe:PASSWORD -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 jdoe:PASSWORD -T fichier ftp://ftp.example.com/
$ curl -u jdoe:PASSWORD -T "{fichier1,fichier2}" ftp://ftp.example.com/
~~~
### Navigateur → curl
Dans Firefox et Chrome/Chromium (et probablement d'autres) il est possible de récupérer une commande curl reprenant exactement la requête que le navigateur a faite. C'est particulièrement pratique si on veut reproduire la requête et faire un debuggage plus fin. Il faut ouvrir le navigateur, dans la partie "réseau" et avec un clic-droit sur la ressource voulue, le menu déroulant proposera "Copy as curl" (ou similaire).