Uno degli strumenti più apprezzati e universalmente più utilizzati in ambiente Linux per il trasferimento dei file da e verso server remoti si chiama curl. Nato nel 1997 curl supporta un ampio ventaglio di protocolli: HTTP, HTTPS, FTP, FTPS, SFTP, IMAP, SMTP, POP3, soltanto per fare qualche nome.
Si tratta di una potente utilità che può essere avviata dalla riga di comando e che per questo motivo è utilizzata non soltanto “su richiesta” per assolvere specifiche esigenze degli utenti ma è integrata in router, stampanti, dispositivi mobili, riproduttori multimediali, smart TV, prodotti multimediali, autovetture e molto altro ancora. Sebbene la sua presenza sia spesso discreta, curl rappresenta la spina dorsale per l’effettuazione di trasferimenti dati con migliaia di applicazioni su miliardi di dispositivi.
Sebbene curl sia “un must” in ambiente Linux si tratta di un’utilità disponibile anche per macOS e Windows oltre che per molti altri sistemi operativi (qui l’elenco completo).
Nonostante la non più giovane età, curl si dimostra ancor oggi uno degli strumenti più utili quando si ha a che fare con la gestione dei trasferimenti di rete, un compagno fidato per la realizzazione di script su qualunque piattaforma e un valido ausilio per ogni sviluppatore. È inoltre continuamente aggiornato.
Le istruzioni per l’installazione di curl nei vari sistemi operativi sono molto semplici e pur trattandosi di un software opensource vengono offerti i file binari (ad esempio per procedere con un caricamento veloce in Windows).
In Windows 10 non è neppure necessario scaricare il file d’installazione di curl: si può usare l’utilità dall’ambiente virtualizzato WSL 2 caricando una qualunque distribuzione Linux (vedere Linux in Windows: come, quando e perché utilizzarlo).
Con WSL 2 si può usare l’utilità curl e interagire direttamente con il file system usato da Windows 10 (non soltanto quindi con quello usato dalla macchina virtuale Linux).
Come usare curl
Il funzionamento dell’utilità curl è relativamente semplice per tutti coloro che abbiano maturato un minimo di esperienza nell’utilizzo della riga di comando o della finestra del terminale.
Con un po’ di ingegno è possibile usare curl all’interno di script più o meno complessi per eseguire una serie di operazioni su richiesta oppure su base periodica.
Nell’articolo Creare backup di un file su Linux e caricarlo via FTP abbiamo visto come creare backup del contenuto di un sistema ed effettuarne l’upload su un server remoto usando proprio curl.
Utilizzando l’utilità cron di Linux si può eventualmente stabilire la frequenza con cui lo script deve essere avviato. Stessa cosa si può fare però su Windows servendosi dell’Utilità di pianificazione (Utilità di pianificazione Windows: cos’è e come si usa).
La sintassi da usare con curl varia a seconda del protocollo con cui si vuole effettuare il trasferimento dati. Digitando curl --help
si otterrà una lista di tutte le opzioni che possono essere affiancate al comando.
Di seguito presentiamo però alcuni interessanti casi di utilizzo.
Per verificare la versione di curl in uso basta digitare curl -V
.
Come scaricare un file e riprendere un download interrotto con curl
Per scaricare un file basta usare la sintassi seguente con curl:
curl -O https://nome-dominio-test.org/file-da-scaricare.tar.gz
curl -o nome-file.tar.gz https://nome-dominio-test.org/file-da-scaricare.tar.gz
Nel primo caso il file indicato verrà memorizzato nella cartella corrente con lo stesso nome; nel secondo il file verrà prelevato e salvato con un nome diverso (è eventualmente possibile specificare un altro percorso per salvare il file in un’altra posizione).
Aggiungendo anche -C -
, esattamente come nell’esempio seguente, è possibile riprendere il download di un file dal punto in cui esso era stato interrotto (ad esempio premendo CTRL+C
):
https://nome-dominio-test.org/file-da-scaricare.tar.gz
curl -C - -o nome-file.tar.gz https://nome-dominio-test.org/file-da-scaricare.tar.gz
Nulla vieta di usare più opzioni -O
per impostare il download di più file. Esempio:
Supponendo di avere a disposizione un file download.txt
contenente un elenco di file da scaricare, usando il comando Linux xargs
è possibile fare in modo di estrarre tutti gli indirizzi, uno per uno, passandoli poi a curl:
Ricorrendo alla sintassi seguente si potrà effettuare il download di file da un server FTP che richiede l’autenticazione specificando nome utente e password:
Per richiedere l’upload di un file un server FTP si può utilizzare il seguente comando:
Per limitare la banda impegnata da curl si può eventualmente usare l’opzione --limit-rate 250K
. Nell’esempio curl non impegnerà la banda di rete per oltre 250 KB/s.
Interagire con le pagine web usando curl
curl risulta utile anche per interfacciarsi con una pagina web ed effettuarne eventualmente il download del contenuto.
Digitando curl
seguito dall’indirizzo della pagina web d’interesse, il comando si limiterà a restituire il sorgente HTML della pagina senza salvare nulla.
Aggiungendo al comando l’opzione -i
si otterranno anche le intestazioni HTTP mentre usando -I
si riceveranno soltanto queste ultime. Analizzandole si può ad esempio stabilire il server web e talvolta anche il sistema operativo installato sulla macchina.
Con curl si possono anche simulare richieste POST ovvero inviare alla pagina di destinazione specificata i dati che essa si attende di ricevere in seguito alla compilazione di un form. Esempio:
Se la pagina indicata si aspettasse di ricevere dati in formato JSON basterà utilizzare la sintassi che segue:
Nel caso in cui si disponesse di un file JSON da passare alla pagina, basterà scrivere:
Nel richiedere qualunque pagina web con curl si può eventualmente aggiungere l’indicazione dello user agent (vedere Come cambiare user agent con i principali browser web e Chrome accantonerà l’utilizzo della stringa user agent: cosa significa). In questo modo ci si potrà presentare al server web remoto come se si fosse il bot di Google oppure come se si stesse utilizzando un dispositivo diverso da quello in uso:
Aggiungendo le opzioni -o
e -O
si può eventualmente salvare la pagina web in locale sotto forma di file HTML.