Quando si presenta la necessità di scaricare (download) o caricare (upload) file e cartelle fra PC e server Linux, nessuno strumento risulta sicuro e potete quanto SSH: oltre alla praticità di non dover installare null'altro, possiamo contare sulla forza della crittografia ed esser certi che i dati scambiati non saranno in alcun modo decifrabili, nemmeno in caso un utente ostile intercettasse i pacchetti in transito. Vediamo allora la sintassi per effettuare download/upload da linea di comando tramite SCP (SSH) con Linux

In questo articolo vedremo come caricare e scaricare file via SSH con Linux. Per la trattazione analoga da PC Windows:
Per chi ha fretta
Se già sei esperto di Linux e cerchi solo un "reminder" per la sintassi, eccoti servito:
-
download file via SCP (SSH):
scp root@mioserver.com:"/cartella1/cartella2/file_da_scaricare.txt" "$HOME" -
upload file via SCP (SSH):
scp "$HOME/file_da_caricare" root@mioserver.com:"/cartella1/cartella2"
Per trasferire intere cartelle è sufficiente (e necessario!) aggiungere l'argomento -r.
Nel resto dell'articolo approfondiremo questi comandi e spiegheremo il significato dei vari argomenti.
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

Ma SSH, nella sua concezione originale, non consente di scambiare 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 su Linux CentOS/Ubuntu: Guida rapida a Pure-FTPd
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

Caricare/scaricare con SSH (SCP) da linea di comando
Per caricare e scaricare file via SSH da linea di comando bisogna usare il comando scp.
» Leggi anche: Come aprire il terminale di Ubuntu
scp è già pre-installato sulla maggior parte delle distribuzioni Linux, ma per esserne sicuri iniziamo lanciando il comando seguente per provare ad installare il pacchetto che lo contiene:
-
Ubuntu:
sudo apt-get install openssh-client -y -
CentOS:
sudo yum install openssh-clients -y
Nota: il nome del pacchetto per CentOS termina con la lettera s, quello per Ubuntu no

Scaricare (download) file via SSH da linea di comando con scp
Per scaricare un file da linea di comando con scp lanceremo qualcosa di simile a:
scp root@mioserver.com:"/cartella1/cartella2/file_da_scaricare.txt" "$HOME"
Dove:
-
scp: è il nome del programma -
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 sistema remoto) del file che desideriamo scaricare -
"$HOME": percorso locale nel quale salvare il file scaricato

Alla primissima esecuzione riceverete un avviso del tipo The authenticity of host 'mioserver.com' can't be established.: digitate y per proseguire.
Dovrete dunque fornire la password associata al nome utente specificato (root, nel nostro esempio), ricordando sempre che si tratta di un account presente sul sistema remoto, e non di quello locale.
Se l'operazione avviene con successo, il trasferimento del file averà inizio. Dopo qualche tempo (a seconda delle dimensioni e della velocità della linea Internet), ne ritroveremo una copia sul computer locale, nel percorso indicato come ultimo parametro ("$HOME", nell'esempio precedente)

Salvare la password di SCP?
Non esiste alcun modo per "salvare" la password usata da scp per evitare di doverla ri-digitare ogni volta. L'unico modo per saltare l'inserimento della password è di effettuare lo scambio chiavi SSH:
Così facendo, il trasferimento avverrà senza bisogno di immettere la password.
Scaricare una cartella via SCP
Se invece di un singolo file desideriamo trasferire un'intera cartella, dobbiamo specificare anche -r. Ad esempio:
scp -r root@mioserver.com:"/cartella1/cartella2/cartella_da_scaricare" "$HOME"

Caricare (upload) file via SSH da linea di comando con SCP
La sintassi per eseguire l'upload da linea di comando con scp è 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:
scp "$HOME/file_da_caricare" root@mioserver.com:"/cartella1/cartella2"
Per caricare un'intera cartella:
scp -r "$HOME/cartella_da_caricare" root@mioserver.com:"/cartella1/cartella2"