Sono un utente abbastanza atipico quando si parla di sistemi operativi. Preferisco nettamente Windows su PC e notebook, ma è Linux (CentOS/Ubuntu) la mia prima scelta quando si parla di server. In questa situazione, trasferire file via SSH tramite SCP/SFTP non è semplice quanto sarebbe fra due sistemi Linux. Fortunatamente, basta conoscere gli strumenti giusti per ottenere un flusso di lavoro ottimale. Vediamo dunque come caricare e scaricare file via SSH (SCP/SFTP) fra Windows e Linux, sia da interfaccia grafica, sia da linea di comando
Articolo aggiornato per rispecchiare la disponibilità nativa del comando scp in Windows 10.

In questo articolo vedremo come svolgere upload e download via SSH, tramite i protocolli SCP/SFTP, fra server Linux remoto e PC Windows locale. Per la trattazione analoga incentrata sullo scambio file da Linux a Linux:
» Leggi: Guida SFTP/SCP, con esempi: download e upload file via SSH da linea di comando (Linux Ubuntu/CentOS)
Protocolli SSH, SFTP e SCP
Iniziamo ricordando che Secure Shell (SSH) è un protocollo che consente di accedere ad un PC o server Linux remoto. Una volta stabilita una connessione con SSH ed essersi autenticati con successo, tutti i comandi impartiti nel terminale vengono eseguiti dal sistema remoto, e non da quello locale. Per connettersi via SSH da un PC Windows ad un server Linux si impiega un apposito client, il più famoso dei quali è chiamato PuTTY
» Leggi anche: Accedere con PuTTY (SSH) senza password a Linux/Ubuntu/CentOS: guida all'autenticazione con chiave asimmetrica (RSA)

SSH serve, appunto, per impartire comandi ad un sistema Linux remoto, ma non è in grado di gestire lo scambio file. Allo scopo, intervengono SCP ed SFTP: due strumenti che si appoggiano ad SSH per gestire il login e la crittografia, ma permettono, appunto, download e upload di file da linea di comando.
SCP ed SFTP sono strumenti diversi fra loro ma, poggiando entrambi su SSH, sono generalmente disponibili entrambi. Il primo consente soltanto di caricare/scaricare file in un solo comando, mentre il secondo permette anche di richiedere la lista dei file e cancellarne alcuni da remoto.
Chiudiamo questa breve panoramica ricordando che SFTP non c'entra assolutamente nulla con il protocollo FTP! Quest'ultimo richiede infatti un proprio programma server (distinto da SSH), e non è crittografato. La versione sicura di FTP si chiama FTPS oppure FTPES, con la lettera "S" posta alla fine
» Leggi anche: Configurare un server FTP con Windows: La Grande Guida a FileZilla Server
Schematicamente:
- SFTP: estensione di SSH che consente download ed upload di file
- FTPS: versione sicura di FTP
Download e upload di file via SSH, con interfaccia grafica: SFTP con FileZilla
FileZilla è un client open source per Windows e Linux che consente di caricare e scaricare file da/verso un sistema remoto. Generalmente, lo si usa con il protocollo FTP, ma è perfettamente in grado di gestire anche lo scambio file via SSH con SFTP

Durante la configurazione della connessione SFTP con FileZilla, ricordate di selezionare SFTP - SSH File Transfer Protocol come Protocollo e, ovviamente, di immettere username e password di un account SSH presente sul sistema al quale ci stiamo connettendo. Per il resto, la procedura è analoga a quella descritta per l'accesso via FTP in questa guida:
» Leggi: Client FTP (FileZilla), guida rapida - caricare e scaricare file da un server FTP remoto

Download e upload di file via SSH, con interfaccia grafica: SCP con WinSCP
In caso il server Linux con il quale desiderate scambiare file sia configurato in modo da non consentire l'accesso SFTP, ma soltanto SCP, allora FileZilla non è compatibile. Quello che ci vuole è un altro client open source chiamato WinSCP:
» Download: WinSCP (portable)
» Download: WinSCP
Ancora una volta, l'interfaccia è estremamente simile -ed il funzionamento generale analogo- a quanto visto per FileZilla. Ricordate di specificare SCP come protocollo, e di fornire credenziali SSH valide

Da notare che WinSCP supporta anche SFTP e persino il protocollo FTP classico. Potete dunque valutare di utilizzare WinSCP come sostituto di FileZilla e mantenerne installato solo uno.
SCP/SFTP per Windows 10, da linea di comando
A partire da Windows 10 1709 (Fall Creators Update), Windows include nativamente un client SSH da linea di comando e, con esso, i comandi sftp o scp.

Di conseguenza, possiamo ora lavorare quasi come se dovessimo svolgere un trasferimento file da Linux a Linux:
Come unica accortezza ricordate di utilizzare i percorsi Windows per indicare il file locale. Ecco dunque che scriveremo:
-
download file via SCP (SSH):
scp root@mioserver.com:"/cartella1/cartella2/file_da_scaricare.txt" "C:\mia_cartella\mio_file.txt" -
upload file via SCP (SSH):
scp "C:\mia_cartella\mio_file.txt" root@mioserver.com:"/cartella1/cartella2"
Per maggiori informazioni rimando nuovamente alla guida specifica.
SCP per Windows 10, da linea di comando: PuTTY Secure Copy client (pscp.exe)
Se il PC impiega Windows 8 o qualsiasi altra generazione precedente a Windows 10 1709, il comando scp non è disponibile nativamente. In tal caso, dobbiamo ripiegare su PuTTY Secure Copy client (pscp.exe)
» Download: PuTTY Secure Copy client (pscp.exe)

Dopo averlo scaricato in una cartella a piacere, apriamo il Prompt dei comandi, quindi impartiamo cd per spostiamoci nella cartella nella quale abbiamo salvato l'eseguibile. Se, ad esempio, abbiamo salvato il file nella cartella Download (predefinita), usiamo:
cd "%USERPROFILE%\Downloads"
Scaricare (download) file via SSH da linea di comando con pscp.exe
Per scaricare un file da linea di comando con pscp.exe lanceremo qualcosa di simile a:
pscp.exe -pw miaPassword root@mioserver.com:"/cartella1/cartella2/file_da_scaricare.txt" "%USERPROFILE%\Downloads"
Dove:
-
pscp.exe: è il nome dell'eseguibile -
-pw miaPassword: password associata all'account SSH da usare per l'autenticazione sul sistema remoto (vedi seguito per alternativa) -
root: username da usare per l'autenticazione sul sistema remoto. È lo stesso utilizzato per l'accesso SSH -
@: è un carattere "fisso" che separa il nome utente (root, in questo esempio) dall'indirizzo del server -
mioserver.com: indirizzo del server con il quale scambiare il file -
:: è un carattere "fisso" che separa l'indirizzo del server (mioserver.com, in questo esempio) dal percorso del file che vogliamo scaricare -
"/cartella1/cartella2/file_da_scaricare.txt": percorso completo (sul server) del file che desideriamo scaricare -
"%USERPROFILE%\Downloads": percorso locale nel quale salvare il file scaricato
Ricordate che tutte le opzioni (come -pw miaPassword) devono obbligatoriamente apparire nel comando prima della coppia "origine destinazione", altrimenti otterrete l'errore More than one remote source not supported.

Alla primissima esecuzione riceverete un avviso del tipo The server's host key is not cached in the registry: digitate y per proseguire.
Autenticazione tramite chiave con PSCP
Se il server è configurato in modo da richiede l'uso delle chiavi, e non di una password, dobbiamo rimuovere -pw miaPassword ed indicare al suo posto il percorso del file che contiene la nostra chiave tramite l'argomento -i. Il comando precedente diventa quindi:
pscp.exe -i "%USERPROFILE%\Chiavi SSH\id_rsa.ppk" root@mioserver.com:"/cartella1/cartella2/file_da_scaricare.txt" "%USERPROFILE%\Downloads"
Da notare che la chiave deve essere quella privata, e deve essere stata preventivamente convertita in "formato PuTTY" (.ppk). Per maggiori info:
Scaricare una cartella con PSCP
Se invece di un singolo file desideriamo trasferire un'intera cartella, dobbiamo specificare anche -r. Ad esempio:
pscp.exe -pw miaPassword -r root@mioserver.com:"/cartella1/cartella2/cartella_da_scaricare" "%USERPROFILE%\Downloads"

Di nuovo: ricordate che anche il -r deve stare prima della coppia "sorgente destinazione".
Caricare (upload) file via SSH da linea di comando con pscp.exe
La sintassi per eseguire l'upload da linea di comando con pscp.exe è esattamente la stessa: basta solo invertire gli argomenti, passando dal percorso_remoto percorso_locale usato fino ad ora al nuovo percorso_locale percorso_remoto.
Per caricare un singolo file:
pscp.exe -pw miaPassword "%USERPROFILE%\Downloads\file_da_caricare" root@mioserver.com:"/cartella1/cartella2"
Per caricare un'intera cartella:
pscp.exe -pw miaPassword -r "%USERPROFILE%\Downloads\cartella_da_caricare" root@mioserver.com:"/cartella1/cartella2/"