Aide-mémoire cURL et wget
| Options cURL Essentielles |
| Option | Description |
-s / --silent | Silencieux (pas de barre de progression ni d'erreurs) |
-S / --show-error | Afficher les erreurs même en mode silencieux (-sS conseillé) |
-o fichier | Écrire la sortie dans un fichier |
-O | Enregistrer avec le nom du fichier distant |
-L / --location | Suivre les redirections HTTP |
-I / --head | Récupérer uniquement les headers (requête HEAD) |
-v / --verbose | Détails de la requête/réponse (debug) |
-w "%{http_code}" | Afficher le code HTTP de la réponse |
-m 30 | Timeout global en secondes |
--connect-timeout 10 | Timeout de connexion en secondes |
-k / --insecure | Ignorer les erreurs SSL (dev/test uniquement !) |
-x proxy:port | Utiliser un proxy |
--retry 3 | Réessayer 3 fois en cas de problème transitoire |
-# / --progress-bar | Afficher une barre de progression |
| Requêtes GET |
| Objectif | Commande |
| Requête simple |
curl https://exemple.com curl -sS https://exemple.com curl -sS -L https://exemple.com/redirect :: suivre redirections |
| Afficher les headers de réponse |
curl -I https://exemple.com curl -sS -D - https://exemple.com -o /dev/null :: headers seuls curl -sS -v https://exemple.com 2>&1 | grep "<" :: headers réponse |
| Récupérer le code HTTP |
curl -sS -o /dev/null -w "%{http_code}" https://exemple.com
:: Dans un script code=$(curl -sS -o /dev/null -w "%{http_code}" https://exemple.com) if [[ $code -ne 200 ]]; then echo "Erreur HTTP $code"; fi |
| Paramètres GET (URL) |
curl "https://api.exemple.com/users?page=1&limit=10" curl -G "https://api.exemple.com/search" --data-urlencode "q=hello world" |
| Envoyer des headers |
curl -H "Accept: application/json" https://api.exemple.com curl -H "Authorization: Bearer TOKEN" https://api.exemple.com/me curl -H "X-API-Key: MONTOKEN" -H "Accept: application/json" https://api.exemple.com |
| Requêtes POST |
| POST formulaire (application/x-www-form-urlencoded) |
curl -X POST https://exemple.com/login \ -d "username=jean&password=secret"
curl -X POST https://exemple.com/form \ --data-urlencode "message=Hello World !" |
| POST JSON (API REST) |
curl -X POST https://api.exemple.com/users \ -H "Content-Type: application/json" \ -d '{"nom":"Jean","email":"jean@exemple.com"}'
:: Depuis un fichier JSON curl -X POST https://api.exemple.com/users \ -H "Content-Type: application/json" \ -d @data.json |
| PUT / PATCH / DELETE |
curl -X PUT https://api.exemple.com/users/1 \ -H "Content-Type: application/json" \ -d '{"nom":"Jean Dupont"}'
curl -X PATCH https://api.exemple.com/users/1 \ -H "Content-Type: application/json" \ -d '{"email":"nouveau@exemple.com"}'
curl -X DELETE https://api.exemple.com/users/1 |
| Traiter la réponse JSON (avec jq) |
curl -sS https://api.exemple.com/users | jq . curl -sS https://api.exemple.com/users | jq '.[0].nom' curl -sS https://api.exemple.com/users | jq '.[] | select(.actif == true)' curl -sS https://api.exemple.com/users | jq -r '.[] | .email' :: sans guillemets |
| Authentification |
| Basic Auth |
curl -u user:password https://exemple.com curl -u user https://exemple.com :: demander le mot de passe
:: Manuel via header curl -H "Authorization: Basic $(echo -n 'user:pass' | base64)" https://exemple.com |
| Bearer Token (OAuth2 / JWT) |
curl -H "Authorization: Bearer eyJhbGci..." https://api.exemple.com/me |
| Digest Auth |
curl --digest -u user:password https://exemple.com |
| Clé API en query string |
curl "https://api.exemple.com/data?api_key=MONTOKEN" |
| Téléchargement et Upload |
| Télécharger un fichier |
curl -LO https://exemple.com/fichier.zip :: garder le nom curl -L -o monFichier.zip https://exemple.com/f.zip :: renommer curl -L --progress-bar -o fichier.zip https://url :: barre de progression curl -C - -O https://exemple.com/gros.iso :: reprendre un téléchargement |
| Upload de fichier (multipart) |
curl -X POST https://api.exemple.com/upload \ -F "fichier=@photo.jpg" \ -F "description=Ma photo"
:: Upload binaire brut curl -X PUT https://api.exemple.com/fichier \ -H "Content-Type: application/octet-stream" \ --data-binary @fichier.bin |
| Téléchargements multiples |
curl -O https://exemple.com/img1.jpg \ -O https://exemple.com/img2.jpg
:: En parallèle (xargs) cat urls.txt | xargs -P 4 -I{} curl -sS -L -O {} |
| Cookies et Sessions |
| Envoyer / recevoir des cookies |
:: Sauvegarder les cookies curl -c cookies.txt https://exemple.com/login \ -d "username=jean&password=secret"
:: Réutiliser les cookies curl -b cookies.txt https://exemple.com/dashboard
:: Les deux (mettre à jour et utiliser) curl -b cookies.txt -c cookies.txt https://exemple.com/page |
| Cookie manuel |
curl -H "Cookie: session_id=abc123; theme=dark" https://exemple.com |
| SSL / Certificats |
| Options SSL |
curl --cacert /chemin/ca.crt https://exemple.com :: CA custom curl --cert client.crt --key client.key https://exemple.com :: cert client curl -k https://exemple.com :: ignorer erreur SSL (insécure!) curl --tlsv1.2 https://exemple.com :: forcer TLS 1.2 |
| Vérifier un certificat SSL via curl |
curl -sS -v https://exemple.com 2>&1 | grep -E "subject:|expire" |
| wget |
| Téléchargement de base |
wget https://exemple.com/fichier.zip wget -O monFichier.zip https://exemple.com/fichier.zip wget -q https://exemple.com/fichier.zip :: silencieux wget -c https://exemple.com/gros.iso :: continuer un téléchargement interrompu wget -b https://exemple.com/fichier.zip :: en arrière-plan |
| Limiter la vitesse / tentatives |
wget --limit-rate=500k https://exemple.com/fichier wget --tries=5 https://exemple.com/fichier wget --timeout=30 https://exemple.com/fichier wget --wait=2 --tries=5 https://exemple.com/fichier :: pause 2s entre tentatives |
| Télécharger une liste de fichiers |
wget -i liste_urls.txt :: Chaque URL sur une ligne du fichier |
| Miroir d'un site (téléchargement récursif) |
wget --mirror --convert-links --page-requisites \ --no-parent -P /var/www/miroir https://exemple.com
:: Options : :: --mirror :: active -r -N -l inf --no-remove-listing :: --convert-links :: adapter les liens pour consultation locale :: --page-requisites :: télécharger CSS, images, JS :: --no-parent :: ne pas remonter dans l'arborescence |
| Requête POST avec wget |
wget --post-data="user=jean&pass=secret" https://exemple.com/login wget --post-file=data.json --header="Content-Type: application/json" https://api.exemple.com |
| Authentification et headers |
wget --http-user=jean --http-password=secret https://exemple.com wget --header="Authorization: Bearer TOKEN" https://api.exemple.com wget --no-check-certificate https://exemple.com :: ignorer SSL |
| Astuces et Patterns Utiles |
| Debug complet d'une requête |
curl -sS -D - -o /dev/null https://exemple.com :: headers seulement curl -v https://exemple.com 2>&1 | less :: tout |
| Mesurer les temps de réponse |
curl -sS -o /dev/null -w "\
dns: %{time_namelookup}s\n\
connect: %{time_connect}s\n\
tls: %{time_appconnect}s\n\
ttfb: %{time_starttransfer}s\n\
total: %{time_total}s\n\
http: %{http_code}\n" https://exemple.com |
| Surveillance de disponibilité (script) |
#!/bin/bash URL="https://monsite.com" code=$(curl -sS -o /dev/null -w "%{http_code}" --max-time 10 "$URL") if [[ "$code" != "200" ]]; then echo "ALERTE : $URL répond $code" | mail -s "Site DOWN" admin@exemple.com fi |
| User-Agent personnalisé |
curl -A "MonBot/1.0" https://exemple.com curl -A "Mozilla/5.0 (compatible)" https://exemple.com |
| Référent (Referer) |
curl -e "https://google.com" https://exemple.com |
| Curl avec fichier de config |
# ~/.curlrc silent show-error location connect-timeout = 15
curl https://exemple.com :: utilise ~/.curlrc automatiquement |