Comando SCP di Linux

SCP è lo strumento classico per copiare file criptati tra macchine in rete con Linux e sistemi operativi compatibili con POSIX. L’abbreviazione SCP sta per Secure Copy (“copia sicura”), dove “secure” si riferisce alla crittografia utilizzata per il trasferimento dei dati. Il nome del protocollo SCP deriva dalle due tecnologie elencate di seguito:

  • il protocollo SSH (Secure Shell), che permette l’accesso criptato ai sistemi remoti;
  • lo strumento RCP (Remote Copy), che copia i file sulla rete in modo non sicuro, cioè senza crittografia.

Il comando SCP è un software che può essere eseguito sul sistema locale e sul server. Lo strumento agisce come demone e client per il protocollo SCP. Dal momento che SCP fa parte della distribuzione OpenSSH, ampiamente utilizzata, è disponibile su quasi tutti i sistemi. Il comando SCP è usato sulla riga di comando, come accade solitamente in Linux.

Uno dei grandi svantaggi del protocollo SCP risiede nella crescita organica del software. Non c’è né una standardizzazione né un documento RFC descrittivo o una specifica simile. Al contrario, è disponibile un’unica implementazione di riferimento come parte del progetto OpenSSH. Attualmente esistono alternative moderne a SCP, il cui uso è preferito per la maggior parte delle applicazioni.

Funzionalità e uso del comando SCP di Linux

La funzionalità del comando SCP è analoga al vecchio comando RCP. Come con RCP, la sintassi SCP sulla riga di comando segue il comando CP usato per copiare i file sul sistema locale. Dal momento che SCP è basato sul protocollo SSH, la comunicazione di rete avviene sulla porta TCP 22. Illustriamo di seguito una panoramica dei comandi Linux comuni per copiare i file:

Comando di copia

Nome

Funzionalità

Accesso remoto

cp

Copy

Copia, solo locale

-

rcp

Remote Copy

Copia locale-remoto, remoto-remoto

RSH

scp

Secure Copy

Copia sicura locale-remoto, remoto-remoto

SSH

sftp

Secure File Transfer Protocol

Copia sicura locale-remoto, remoto-remoto; manipolazione di file system remoti

SSH

rsync

Remote Sync

Copia sicura locale, locale-remoto, remoto-remoto; sincronizzazione

SSH, Stunnel

Con SCP potete copiare un file su un server o scaricarlo da un server. Il protocollo permette solo un flusso di dati unidirezionale; questo significa che si può copiare solo in una direzione per connessione. Inoltre, con SCP è possibile copiare file tra due sistemi in rete. Opzionalmente, gli attributi del file di origine possono essere trasferiti al file di destinazione durante tutte le operazioni di copia.

Flusso di dati durante la copia tra due sistemi remoti

Se volete copiare un file tra due sistemi remoti sotto Linux con SCP, occorre prendere in considerazione alcune speciali caratteristiche. SCP usa il protocollo SSH per stabilire connessioni criptate. L’accesso a un sistema remoto con SSH avviene o con nome utente e password o con chiavi SSH (coppia di chiavi pubbliche/private). In generale, il metodo privato è preferibile al metodo pubblico.

Nella variante originale, in cui SCP è usato per trasferire un file da un sistema remoto (host) a un altro host, si verifica il seguente processo:

  1. L’utente istruisce lo strumento SCP sul suo sistema locale per trasferire un file situato sull’host 1 all’host 2.
  2. Il programma SCP sul sistema locale dell’utente apre una connessione SSH all’host 1 ed esegue il programma SCP situato lì.
  3. Il programma SCP sull’host 1 apre una connessione SSH all’host 2 e trasferisce il file memorizzato sull’host 1 all’host 2 come se fosse un file locale.

Affinché questo processo funzioni, una chiave SSH pubblica deve essere memorizzata dall’host 1 all’host 2. Tuttavia, se questo è il caso, avviene un accesso permanente dall’host 1 all’host 2 senza intervento dell’utente, che rappresenta un rischio per la sicurezza. Perciò esiste una variante più moderna:

  1. L’utente istruisce lo strumento SCP sul suo sistema locale per trasferire un file situato sull’host 1 all’host 2.
  2. SCP apre una connessione SSH rispettivamente all’host 1 e all’host 2.
  3. Il file viene instradato dall’host 1 attraverso il sistema locale e trasferito all’host 2.

In questo caso, le chiavi pubbliche SSH dell’utente devono essere memorizzate sull’host 1 e sull’host 2. In molti scenari applicativi è questo che dovrebbe verificarsi, ad esempio se l’utente è un amministratore che ha accesso a entrambi gli host.

Sintassi del comando SCP di Linux

La sintassi di un comando da riga di comando definisce il modo in cui il comando deve essere inserito per essere eseguito correttamente. Di seguito vi mostriamo schematicamente la sintassi del comando SCP. Lo schema di base per l’uso del comando SCP è basato sulla sintassi del comando CP usato per copiare i file sul sistema locale: un file situato in un percorso di origine viene copiato in un percorso di destinazione. Alcune opzioni possono essere precedute dal prefisso del percorso di origine, come richiesto:

scp <Opzioni> <Percorsodiorigine> <Percorsodidestinazione>

Per copiare file da, verso o tra sistemi remoti, il percorso di origine o di destinazione, o entrambi, sono sostituiti da una specifica di percorso più complessa. Tale specifica di percorso contiene il nome della rete o l’indirizzo IP dell’host e il nome dell’utente che desidera accedere all’host:

<Utente>@<Host>:<Cartella/File.estensione>

Rappresentiamo di seguito la specifica ‘<utente>@<host>‘ a titolo esemplificativo come ‘user@example.com’ (per l’host 1) o ‘user@www.example.com’ (per l’host 2).

Opzioni del comando SCP di Linux

Come al solito con gli strumenti a riga di comando, il funzionamento del comando SCP è controllato da varie opzioni. Di seguito vi mostriamo una selezione delle opzioni più utili:

Opzione

Significato

Commento

-C

Utilizza la compressione (compression)

Non confondere con l’opzione ‘-c’ (cipher), che imposta il metodo di crittografia

-p

Trasferisce gli attributi dei file ai file di destinazione (permissions)

Non confondere con l’opzione ‘-P’ che imposta la porta di rete

-r

Copia le directory in modo ricorsivo (recursive)

-

-v

Visualizza l’output esteso (verbose)

-

-q

Sopprime l’output (quiet)

-

-3

Invia i dati attraverso il sistema locale (third party)

-

Consiglio

Per una descrizione dettagliata di tutte le opzioni disponibili, potete accedere alla pagina man del comando SCP.

Esempi di utilizzo del comando SCP di Linux

Il comando SCP può essere usato in vari modi e può essere combinato sulla riga di comando con i modelli noti per specificare file e directory. Data la vasta gamma di possibili scenari di applicazione, vi illustriamo di seguito solo alcuni casi tipici. Tenete presente che al giorno d’oggi, per copiare i file in rete, sono in genere preferiti strumenti diversi dal comando SCP.

Copiare un file dal sistema locale a quello remoto

Per copiare un file ‘file.txt’ dalla directory corrente nel sistema locale all’host ‘example.com’, usiamo la seguente chiamata SCP. Notate che in questo esempio simuliamo di avere accesso all’host ‘example.com’ come un utente chiamato ‘user’.

scp file.txt user@example.com:/percorso/alla/directory

Una volta che la copia è andata a buon fine, il file ‘file.txt’ si trova sull’host nella directory ‘/percorso/alla/directory’.

Copiare un file dal sistema remoto a quello locale

Per invertire la direzione dell’operazione di copia, è sufficiente scambiare i percorsi locale e remoto. Nel primo esempio, usiamo il punto ‘.’ per specificare la directory corrente come destinazione:

scp user@example.com:/percorso/alla/directory/file.txt .

Di seguito riportiamo una variazione del primo esempio e copiamo il file nella cartella ‘Desktop’ nella cartella utente, simboleggiata dalla tilde ‘~’. Si noti che quando si usa la tilde la cartella utente locale viene sostituita. Per evitare errori, un percorso con tilde dovrebbe essere racchiuso tra virgolette:

scp user@example.com:/percorso/alla/directory/file.txt "~/Desktop/"

Se vogliamo copiare il file e salvarlo con un nome diverso, specifichiamo il nuovo nome alla fine del percorso di destinazione:

scp user@example.com:/percorso/alla/directory/file.txt "~/Desktop/file.bak"

Copiare più file

Se avete dimestichezza con l’uso del comando CP, magari già sospettate che sia possibile anche copiare più file con il comando SCP. Il modo più semplice per svolgere questa operazione è quello di elencare i file uno a uno. Nell’esempio riportato di seguito, i file specificati si trovano nella directory corrente; non abbiamo quindi bisogno di specificare il percorso di ogni singolo file:

scp file-1.txt file-2.txt user@example.com:/percorso/alla/directory

Fate attenzione quando usate “wildcard” e “globs” come ‘?’ e ‘*’. Anche se risultano comodi per rendere compatti i modelli nei nomi dei file, possono portare a errori inaspettati quando vengono usati nel percorso dell’host. In questi casi, è meglio usare un ciclo, come mostrato nel nostro esempio “Spostare i file su un sistema remoto”, oppure ricorrere a uno strumento alternativo.

Copiare un’intera directory

Come al solito con il comando CP, è possibile copiare in modo ricorsivo un’intera directory. Specifichiamo l’opzione ‘-r’ prima del percorso di origine.

scp -r directory user@example.com:/percorso/alla/directory

Dopo un’esecuzione riuscita con successo, tutti i file e le sottodirectory nella directory ‘directory’ si trovano come copia sull’host al percorso ‘/percorso/alla/directory’.

Per trasferire file più grandi, è utile usare l’opzione ‘-C’, che comprime i file per il trasferimento:

scp -C -r directory user@example.com:/percorso/alla/directory
N.B.

Tenete presente che SCP trasferisce sempre tutti i file completamente. Se il trasferimento si interrompe, bisogna ricominciare tutto da capo. Per copiare grandi directory o quando la connessione di rete è instabile, potrebbe essere opportuno ricorrere a uno strumento alternativo.

Copiare un file tra due sistemi remoti

Per copiare un file tra due host, usiamo il comando SCP senza specificare un percorso locale. I percorsi di origine e destinazione devono contenere informazioni sull’utente e sull’host:

scp user@example.com:/percorso/alla/directory/file.txt user@www.example.com:/percorso/altra/directory

Come osservato all’inizio, spesso è meglio instradare il trasferimento attraverso il proprio sistema. Per questo usiamo l’opzione ‘-3’, che viene aggiunta al percorso di origine:

scp -3 user@example.com:/percorso/alla/directory/file.txt user@www.example.com:/percorso/altra/directory

Spostare i file su un sistema remoto

Uno scenario più complesso per l’utilizzo del comando SCP è quello di spostare dati locali su un host. Questo può essere usato, ad esempio, per creare un backup remoto di file che non sono più necessari in locale. Analogamente alla distinzione tra i comandi locali ‘cp’ (“Copy”, copia) e ‘mv’ (“Move”, sposta), il comando SCP non fornisce un’opzione separata per spostare un file. Tuttavia, possiamo farlo facilmente da soli usando metodi comuni.

Esaminiamo prima l’operazione di spostamento, che è composta da una copia e poi da una cancellazione. Implementiamo questa sequenza di operazioni sulla riga di comando combinando i comandi ‘scp’ e ‘rm’, quest’ultimo usato per cancellare un file. Concateniamo i comandi con l’operatore logico AND ‘&&’, in modo che il secondo comando venga eseguito solo se il primo ha avuto successo. In questo modo ci assicuriamo che la copia sia stata creata sull’host prima che l’originale locale venga cancellato.

Ultimo ma non meno importante, usiamo un ciclo ‘for’ per processare tutti i file che si trovano nella directory corrente. Opzionalmente, specifichiamo un modello per includere solo certi file o tipi di file. Dato che vogliamo fare un backup esatto di ogni file, usiamo l’opzione ‘-p’ per copiare anche gli attributi del file. Poiché la creazione di un backup è un processo critico, istruiamo il comando SCP a produrre informazioni aggiuntive sullo stato con l’opzione ‘-v’.

 

for file in ./modello*.estensione ; do scp -p -v &quot;$file&quot; user@example.com:&quot;/backup/${file}.bak&quot; &amp;&amp; rm &quot;$file&quot; ; done

Alternative al comando SCP di Linux

Anche se SCP è disponibile su quasi tutti i sistemi, non è più il metodo preferito per copiare file sulla rete. Lo sottolineano anche gli sviluppatori del progetto OpenSSH, che ospita SCP. Le alternative SFTP (Secure File Transfer Protocol) e Rsync (Remote Sync), nominate dai manutentori di SCP, usano anche SSH per l’accesso criptato all’host remoto. Entrambe offrono funzionalità superiori e sono in fase di sviluppo attivo. L’unico serio svantaggio di questi strumenti è che potrebbe essere necessario installarli prima, mentre SCP è preinstallato su quasi tutti i sistemi. Vediamo più da vicino queste alternative.

SFTP è più o meno il successore diretto di SCP. Il trasferimento dei dati è garantito da crittografia e utilizza l’infrastruttura SSH esistente. In termini pratici, questo significa che SFTP può essere usato per accedere ai file system remoti degli host che hanno l’accesso SSH dal sistema locale. Il protocollo SFTP offre una gamma di funzioni molto più alta di SCP. La correttezza dei dati trasferiti viene controllata automaticamente ed è possibile riprendere i trasferimenti interrotti.

Con Rsync è disponibile un altro potente strumento che può svolgere tutti i compiti di SCP. Tuttavia, Rsync non è un comando di copia nel vero senso della parola. Lo strumento può fare molto di più ed è specialmente progettato per il trasferimento efficiente di grandi file e quantità di dati. A tal scopo, Rsync confronta i dati presenti sull’origine e sulla destinazione e trasferisce solo la differenza. Se un trasferimento viene interrotto e riavviato, non è necessario ricominciare dall’inizio.

In sintesi

Se disponibili sul vostro sistema, dovreste usare gli strumenti SFTP o Rsync invece di SCP per copiare i file sulla rete.


Abbiamo una proposta per te:
Web hosting a partire da 1 €/mese!

Dominio gratis
Certificato SSL Wildcard incluso
Assistenza clienti 24/7
A partire da 1 €/mese IVA escl. per un anno,
poi 8 €/ mese IVA escl.