Aide-mémoire cURL et wget
Options cURL Essentielles
OptionDescription
-s / --silentSilencieux (pas de barre de progression ni d'erreurs)
-S / --show-errorAfficher les erreurs même en mode silencieux (-sS conseillé)
-o fichierÉcrire la sortie dans un fichier
-OEnregistrer avec le nom du fichier distant
-L / --locationSuivre les redirections HTTP
-I / --headRécupérer uniquement les headers (requête HEAD)
-v / --verboseDétails de la requête/réponse (debug)
-w "%{http_code}"Afficher le code HTTP de la réponse
-m 30Timeout global en secondes
--connect-timeout 10Timeout de connexion en secondes
-k / --insecureIgnorer les erreurs SSL (dev/test uniquement !)
-x proxy:portUtiliser un proxy
--retry 3Réessayer 3 fois en cas de problème transitoire
-# / --progress-barAfficher une barre de progression
Requêtes GET
ObjectifCommande
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