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/1Esegue 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/1L’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.zipCon -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/3xEjMpAQuando 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.comL’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.localL’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-privatiL’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/profiloAggiunge 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/1Con -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-riservataL’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.comL’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.pdfcURL 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.comL’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.115049sQuesto 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.isoL’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.isoL’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/datiSe 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.comQuesto comando restituisce solo il codice HTTP della risposta (es. 200, 404, 500), 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.
