Command Line - Linux - Windows

cURL: esempi di comandi

Client URL (cURL) è uno strumento a riga di comando versatile, disponibile su ogni sistema operativo, che permette di trasferire dati da e verso un server utilizzando diversi protocolli: HTTP, HTTPS, FTP, SFTP e molti altri. Vediamo alcuni esempi di comandi.

La richiesta GET di base

curl https://blog.domain.local/posts/1

Esegue una richiesta HTTP GET all’URL specificato e stampa la risposta direttamente nel terminale. È il modo più semplice per recuperare il contenuto di una pagina web o la risposta di un’API. In questo caso restituisce un post di esempio in formato JSON

Salvare l’output su file

curl -o risposta.json https://blog.domain.local/posts/1

L’opzione -o (output) dice a cURL di salvare il contenuto scaricato nel file risposta.json anziché stamparlo nel terminale. Utile quando si vuole conservare la risposta per elaborarla in seguito

curl -O https://blog.domain.local/archivio.zip

Con -O (lettera maiuscola), cURL salva il file usando lo stesso nome che ha nell’URL remoto, in questo caso archivio.zip. È il metodo più semplice quando si scaricano file

Seguire i redirect

curl -L https://bit.ly/3xEjMpA

Quando un server risponde con un reindirizzamento (codice HTTP 301 o 302), cURL di default si ferma. L’opzione -L (location) gli dice di seguire automaticamente tutti i redirect fino alla destinazione finale. Indispensabile quando si lavora con URL abbreviati o pagine che reindirizzano

Visualizzare gli header HTTP

curl -I https://www.google.com

L’opzione -I (head) invia una richiesta HEAD e mostra solo gli header della risposta HTTP, senza il corpo. È molto utile per controllare il codice di stato del server, il tipo di contenuto, le informazioni sulla cache e altri metadati, senza dover scaricare l’intera pagina

curl -v https://blog.domain.local

L’opzione -v (verbose) mostra l’intera comunicazione con il server: gli header inviati, quelli ricevuti, l’handshake TLS e il corpo della risposta. È lo strumento ideale per il debug di connessioni e richieste HTTP

Inviare una richiesta POST con dati JSON

curl -X POST https://blog.domain.local/posts \
  -H "Content-Type: application/json" \
  -d '{"title": "Il mio post", "body": "Contenuto del post", "userId": 1}'

Questa combinazione di opzioni esegue una richiesta POST

  • -X POST: specifica il metodo HTTP da usare
  • -H “Content-Type: application/json”: aggiunge un header per indicare al server che si sta inviando JSON
  • -d (data): fornisce il corpo della richiesta con i dati da inviare

La risposta del server sarà la conferma della creazione della risorsa

Autenticazione HTTP Basic

curl -u username:password https://api.domain.local/dati-privati

L’opzione -u (user) invia le credenziali di autenticazione HTTP Basic. Le credenziali vengono codificate in Base64 e incluse nell’header Authorization. Attenzione: usare sempre HTTPS per non trasmettere le credenziali in chiaro

Usare un token Bearer (autenticazione API)

curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" \
  https://api.domain.local/profilo

Aggiunge manualmente un header Authorization con un token Bearer, il metodo di autenticazione standard per le API moderne che usano JWT o OAuth2. L’opzione -H permette di aggiungere qualsiasi header HTTP personalizzato alla richiesta

Eseguire una richiesta PUT o DELETE

# Aggiornare una risorsa con PUT
curl -X PUT https://blog.domain.local/posts/1 \
  -H "Content-Type: application/json" \
  -d '{"id": 1, "title": "Titolo aggiornato", "body": "Nuovo contenuto", "userId": 1}'

# Eliminare una risorsa con DELETE
curl -X DELETE https://blog.domain.local/posts/1

Con -X si può specificare qualsiasi metodo HTTP. PUT viene usato per aggiornare una risorsa esistente, DELETE per eliminarla. Questi comandi sono fondamentali per testare le API REST senza dover usare strumenti grafici come Postman

Salvare e riutilizzare i cookie

# Login e salvataggio del cookie di sessione
curl -c cookies.txt -X POST https://blog.domain.local/login \
  -d "user=carlo&password=segreto"

# Richiesta successiva usando i cookie salvati
curl -b cookies.txt https://blog.domain.local/area-riservata

L’opzione -c (cookie-jar) salva i cookie ricevuti dal server in un file. L’opzione -b (cookie) li riutilizza nelle richieste successive, simulando una sessione autenticata come farebbe un browser. Utile per automatizzare interazioni con siti web che richiedono login

Ignorare gli errori di certificato SSL

curl -k https://sito-con-certificato-scaduto.com

L’opzione -k (o –insecure) disabilita la verifica del certificato SSL. Usare con estrema cautela e solo in ambienti di sviluppo o test: bypassare la verifica SSL espone la connessione a potenziali attacchi man-in-the-middle

Impostare un timeout

curl --connect-timeout 5 --max-time 30 https://api.domain.local/dati

–connect-timeout 5 imposta a 5 secondi il tempo massimo per stabilire la connessione, mentre –max-time 30 limita a 30 secondi la durata totale dell’operazione. Utile negli script automatizzati per evitare che un server lento blocchi l’esecuzione

Scaricare più file in parallelo

curl -O https://blog.domain.local/file1.pdf \
     -O https://blog.domain.local/file2.pdf \
     -O https://blog.domain.local/file3.pdf

cURL può gestire più URL in un singolo comando. Aggiungendo più opzioni -O, scarica i file in sequenza

Usare un proxy

curl -x http://proxy.domain.local:8080 https://www.google.com

L’opzione -x (proxy) instrada la richiesta attraverso un server proxy HTTP. Utilizzato in ambienti aziendali dove tutta la navigazione passa per un proxy, o per fare test con IP diversi dal proprio

Misurare i tempi di risposta

curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nConnessione: %{time_connect}s\nRisposta: %{time_starttransfer}s\nTotale: %{time_total}s\n" https://www.google.com

DNS: 0.011285s
Connessione: 0.019681s
Risposta: 0.111678s
Totale: 0.115049s

Questo comando misura i tempi delle varie fasi della richiesta

  • -o /dev/null: scarta il corpo della risposta
  • -s (silent): elimina la barra di avanzamento
  • -w (write-out): formatta le statistiche finali con variabili

Riprendere un download interrotto

curl -C - -O https://www.domain.local/file.iso

L’opzione -C – (continue-at) dice a cURL di riprendere automaticamente un download interrotto dal punto in cui si era fermato. Il trattino  significa “calcola dove si era arrivati”. Utilizzato quando si scaricano file molto grandi con connessioni instabili

Limitare la velocità di download

curl --limit-rate 500k -O https://www.domain.local/file.iso

L’opzione –limit-rate imposta un limite di banda per il trasferimento. In questo caso la velocità massima è 500 KB/s

Trasferire file via FTP

# Download da FTP
curl -u ftpuser:ftppassword ftp://ftp.domain.local/files/documento.pdf -o documento.pdf

# Upload su FTP
curl -u ftpuser:ftppassword -T report.pdf ftp://ftp.download.local/upload/

cURL supporta nativamente il protocollo FTP. Con -T (transfer) si carica un file sul server FTP, mentre senza -T lo si scarica. Le credenziali vengono fornite con -u come per HTTP Basic. Un modo rapido per automatizzare trasferimenti FTP senza installare client dedicati

Usare un certificato client (mTLS)

curl --cert client.crt --key client.key https://api.domain.local/dati

Se dobbiamo utilizzare delle API che richiedono l’autenticazione mTLS dove anche il client deve presentare un certificato, –cert specifica il certificato del client e –key la sua chiave privata. È il livello di sicurezza più alto nelle comunicazioni HTTPS

Controllare solo il codice di risposta HTTP

curl -s -o /dev/null -w "%{http_code}" https://www.google.com

Questo comando restituisce solo il codice HTTP della risposta (es. 200404500), scartando tutto il resto. -s elimina l’output di progresso, -o /dev/null scarta il corpo, e -w “%{http_code}” stampa solo il codice di stato. Perfetto per script di monitoring che devono verificare se un sito è raggiungibile

Conclusioni

cURL è molto più di un semplice tool per scaricare file. Conoscere le sue opzioni principali permette di testare API, automatizzare download, simulare sessioni browser e diagnosticare problemi di rete in modo rapido ed efficace.