Il mondo Linux mette a disposizione molti programmi per scaricare file da Internet tramite linea di comando. I più popolari sono curl
(ora integrato anche in Windows 10) e wget
: strumenti potentissimi, la cui ricca sintassi può però disorientare. Vediamo dunque come usarli in pratica per effettuare il download di file da terminale Linux, Windows 10 o Mac
Articolo aggiornato per rispecchiare la disponibilità di curl in Windows 10.
In questo articolo vedremo come scaricare file da linea di comando con Linux, Windows 10 e Mac. La procedura è stata testata con Windows 10 2004, Ubuntu 20.04 e CentOS 7.3, ma la sintassi è grossomodo inalterata da decenni, motivo per cui è presumibile che continui a rimanere la stessa negli anni a venire.
Ricordiamo inoltre che curl e wget sono strumenti ottimali per scaricare file da fonti HTTP/HTTPS (pagine web) e FTP tramite linea di comando, ma, in linea di massima, non sono la scelta "di riferimento" per trasferire tramite protocollo SSH. Allo scopo, si impiegano SFTP o SCP:
» Leggi: Guida: download e upload via SFTP/SCP (SSH) da linea di comando (Windows 10, Linux Ubuntu/CentOS)
Per chi ha fretta
Se già siete esperti e cercate solo un "reminder" per la sintassi, eccovi serviti:
-
download con curl:
curl -L -o "/dir1/dir2/miofile.txt" "https://turbolab.it/scarica/204"
-
download con wget:
wget -O "/dir1/dir2/miofile.txt" "https://turbolab.it/scarica/204"
Per interrompere, premere la combinazione da tastiera Ctrl+C
.
Ricordate che curl è integrato nativamente anche in Windows 10 1803 (aprile 2018) e successivi, mentre wget deve essere scaricato a parte. In ambiente Windows useremo, ovviamente, i percorsi appropriati (esempio: "C:\dir1\dir2\miofile.txt"
).
Nel resto dell'articolo approfondiremo l'uso dei comandi e spiegheremo il significato dei vari argomenti.
Aprire il terminale
Per prima cosa, dobbiamo aprire la shell testuale. Per le indicazioni passo passo:
Scaricare file nella cartella corrente
Se vogliamo scaricare rapidamente un file da linea di comando basta impartire uno di questi due comandi:
-
curl -O "https://turbolab.it/scarica/204"
(l'opzione è una "O di Otranto", tassativamente MAIUSCOLA) wget "https://turbolab.it/scarica/204"
Il file verrà scaricato nella cartella corrente (visualizzabile impartendo pwd
su Linux oppure cd
su Windows), con lo stesso nome che ha sul server remoto
Scaricare il file scegliendo il nome
In molti casi, però, vorremo specificare il nome da assegnare al file scaricato. Allo scopo, usiamo:
-
curl -o "miofile.txt" "https://turbolab.it/scarica/204"
(l'opzione è una "o di oggi", minuscola) -
wget -O "miofile.txt" "https://turbolab.it/scarica/204"
(l'opzione è una "O di Otranto", maiuscola)
In questo caso, il file viene scaricato nella cartella corrente, ma con il nome da noi scelto
Scaricare il file scegliendo la cartella
Non siamo obbligati a scaricare il file nella cartella corrente. Possiamo infatti specificare il percorso di destinazione completo sulla linea di comando. La sintassi è la stessa usata nell'esempio precedente:
-
curl -o "/percorso/cartella/miofile.txt" "https://turbolab.it/scarica/204"
(l'opzione è una "o di oggi", minuscola) -
wget -O "/percorso/cartella/miofile.txt" "https://turbolab.it/scarica/204"
(l'opzione è una "O di Otranto", maiuscola)
In ambiente Windows useremo, ovviamente, i percorsi appropriati. Ad esempio:
curl -o "C:\percorso\cartella\miofile.txt" "https://turbolab.it/scarica/204"
Seguire i redirect (solo curl)
wget segue automaticamente i redirect. Ecco dunque che, provando a scaricare un file come https://turbolab.it/scarica/53
(si tratta di Windows 10 Media Creation Tool) wget legge la risposta del server di TurboLab.it, interpreta correttamente la ridirezione e scarica il file dal server di Microsoft.
Al contrario, curl non segue i redirect e si limita a prelevare un file da zero byte. Per ottenere il comportamento atteso e seguire i redirect con curl è necessario esplicitare il parametro -L
(maiuscolo). Scriveremo dunque:
curl -L -o "win10 media creation tool.exe" "https://turbolab.it/scarica/53"
In caso di dubbio, possiamo sempre specificare -L
ad ogni invocazione di curl. Verrà applicato solo se effettivamente necessario.
"Resume" dei download interrotti
wget e curl permettono di riprendere il download di un file precedentemente scaricato solo parzialmente, senza bisogno di ricominciare da zero.
Per testare la funzione possiamo iniziare a scaricare un pacchetto voluminoso, come il Service pack per Windows 7 (circa 2 GB):
curl -o "win7_sp.iso" "https://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso"
wget -O "win7_sp.iso" "https://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso"
Dopo qualche secondo, interrompiamo il download premendo Ctrl+C
.
Ora riprendiamo il download del file aggiungendo l'argomento -c
(per wget) oppure -C -
(per curl) e notiamo che il trasferimento riprende da dove si era interrotto:
curl -C - -o "win7_sp.iso" "https://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso"
wget -c -O "win7_sp.iso" "https://download.microsoft.com/download/0/A/F/0AFB5316-3062-494A-AB78-7FB0D4461357/7601.17514.101119-1850_Update_Sp_Wave1-GRMSP1.1_DVD.iso"
Per quanto riguarda wget, ho mostrato nell'articolo "Come usare wget per Windows e scaricare file su connessioni instabili con resume e retry automatici (Operazione non riuscita - Errore di rete)" quali parametri usare per riprendere il download automaticamente in caso di frequenti singhiozzi della connessione.
Specificare lo "user agent"
Quando si effettua un accesso HTTP o un download tramite un tradizionale browser web, il nostro navigatore invia al server un'intestazione chiamata user-agent
: è una stringa che identifica il programma (Google Chrome, Mozilla Firefox, Microsoft Edge ecc) e il sistema operativo. Al momento, ad esempio, il mio Google Chrome su Windows 10 sta comunicando ai vari server quanto segue:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.18 Safari/537.36
Con Firefox, invece:
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Per scoprire questa stringa possiamo usare gli strumenti di sviluppo integrati nel browser web oppure impiegare un servizio come questo:
» Vedi: What's My User Agent?
Anche curl e wget inviano il proprio user-agent. Sul sistema dal quale ho svolto le prove, si tratta di:
-
curl:
curl/7.55.1
-
wget:
Wget/1.19.1 (linux-gnu)
Alcuni server verificano esplicitamente lo user-agent e, quando rilevano che l'utente sta cercando di scaricare tramite un programma diverso da uno dei browser web riconosciuti, impediscono il download. Per aggirare questa sciocca limitazione basta esplicitare lo user-agent da usare.
A scopo di test, lanciate un comando come questo:
curl -A "User-agent di prova" -o "prova_useragent.html" "https://www.whoishostingthis.com/tools/user-agent/"
wget --user-agent="User-agent di prova!" -O "prova_useragent.html" "https://www.whoishostingthis.com/tools/user-agent/"
Aprite ora il file prova_useragent.html
con il browser web e dovereste ritrovarvi esattamente la stringa immessa da linea di comando come user-agent ricevuto dal server
A questo punto potete ripetere il tentativo di download del file "protetto", utilizzando come user-agent quello di un browser qualsiasi. Potete, ad esempio, copia-incollare uno dei due esempi (Chrome o Firefox su Windows 10) che ho citato poco sopra.
Ignorare i certificati HTTPS non-validi
wget e curl si rifiutano di scaricare file da indirizzi HTTPS se il certificato digitale dei siti non è perfettamente valido (fra gli altri: non è scaduto o revocato, è rilasciato da un'autorità di certificazione (CA) accreditata ecc.). Si tratta di una misura di sicurezza in più che garantisce l'integrità e l'autenticità dei file scaricati ma, in alcune circostanze, è necessario forzare e scaricare comunque. Allo scopo, bisogna esplicitare un argomento in più:
curl -k -o "certificato_invalido.html" "https://wrong.host.badssl.com/"
wget --no-check-certificate -O "certificato_invalido.html" "https://wrong.host.badssl.com/"
Conclusioni
In questa guida abbiamo visto come scaricare un file da linea di comando con Windows 10 o Linux tramite wget e curl.
Entrambi i comandi prevedono molte altre opzioni che ne modificano il comportamento. Per maggiori informazioni, si veda la rispettiva documentazione ufficiale: