SCP è lo strumento classico per copiare file criptati tra macchine in rete con Linux e sistemi operativi com­pa­ti­bi­li con POSIX. L’ab­bre­via­zio­ne SCP sta per Secure Copy (“copia sicura”), dove “secure” si riferisce alla crit­to­gra­fia uti­liz­za­ta per il tra­sfe­ri­men­to dei dati. Il nome del pro­to­col­lo SCP deriva dalle due tec­no­lo­gie elencate di seguito:

  • il pro­to­col­lo 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 crit­to­gra­fia.

Il comando SCP è un software che può essere eseguito sul sistema locale e sul server. Lo strumento agisce come demone e client per il pro­to­col­lo SCP. Dal momento che SCP fa parte della di­stri­bu­zio­ne OpenSSH, am­pia­men­te uti­liz­za­ta, è di­spo­ni­bi­le su quasi tutti i sistemi. Il comando SCP è usato sulla riga di comando, come accade so­li­ta­men­te in Linux.

Uno dei grandi svantaggi del pro­to­col­lo SCP risiede nella crescita organica del software. Non c’è né una stan­dar­diz­za­zio­ne né un documento RFC de­scrit­ti­vo o una specifica simile. Al contrario, è di­spo­ni­bi­le un’unica im­ple­men­ta­zio­ne di ri­fe­ri­men­to come parte del progetto OpenSSH. At­tual­men­te esistono al­ter­na­ti­ve moderne a SCP, il cui uso è preferito per la maggior parte delle ap­pli­ca­zio­ni.

Fun­zio­na­li­tà e uso del comando SCP di Linux

La fun­zio­na­li­tà 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 pro­to­col­lo SSH, la co­mu­ni­ca­zio­ne di rete avviene sulla porta TCP 22. Il­lu­stria­mo di seguito una pa­no­ra­mi­ca dei comandi Linux comuni per copiare i file:

Comando di copia Nome Fun­zio­na­li­tà 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; ma­ni­po­la­zio­ne di file system remoti SSH
rsync Remote Sync Copia sicura locale, locale-remoto, remoto-remoto; sin­cro­niz­za­zio­ne SSH, Stunnel

Con SCP potete copiare un file su un server o sca­ri­car­lo da un server. Il pro­to­col­lo permette solo un flusso di dati uni­di­re­zio­na­le; questo significa che si può copiare solo in una direzione per con­nes­sio­ne. Inoltre, con SCP è possibile copiare file tra due sistemi in rete. Op­zio­nal­men­te, gli attributi del file di origine possono essere tra­sfe­ri­ti al file di de­sti­na­zio­ne durante tutte le ope­ra­zio­ni 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 con­si­de­ra­zio­ne alcune speciali ca­rat­te­ri­sti­che. SCP usa il pro­to­col­lo SSH per stabilire con­nes­sio­ni 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 è pre­fe­ri­bi­le al metodo pubblico.

Nella variante originale, in cui SCP è usato per tra­sfe­ri­re 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 tra­sfe­ri­re un file situato sull’host 1 all’host 2.
  2. Il programma SCP sul sistema locale dell’utente apre una con­nes­sio­ne SSH all’host 1 ed esegue il programma SCP situato lì.
  3. Il programma SCP sull’host 1 apre una con­nes­sio­ne SSH all’host 2 e tra­sfe­ri­sce il file me­mo­riz­za­to sull’host 1 all’host 2 come se fosse un file locale.

Affinché questo processo funzioni, una chiave SSH pubblica deve essere me­mo­riz­za­ta dall’host 1 all’host 2. Tuttavia, se questo è il caso, avviene un accesso per­ma­nen­te dall’host 1 all’host 2 senza in­ter­ven­to dell’utente, che rap­pre­sen­ta un rischio per la sicurezza. Perciò esiste una variante più moderna:

  1. L’utente istruisce lo strumento SCP sul suo sistema locale per tra­sfe­ri­re un file situato sull’host 1 all’host 2.
  2. SCP apre una con­nes­sio­ne SSH ri­spet­ti­va­men­te all’host 1 e all’host 2.
  3. Il file viene in­stra­da­to dall’host 1 at­tra­ver­so il sistema locale e tra­sfe­ri­to all’host 2.

In questo caso, le chiavi pubbliche SSH dell’utente devono essere me­mo­riz­za­te sull’host 1 e sull’host 2. In molti scenari ap­pli­ca­ti­vi è questo che dovrebbe ve­ri­fi­car­si, ad esempio se l’utente è un am­mi­ni­stra­to­re 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 cor­ret­ta­men­te. Di seguito vi mostriamo sche­ma­ti­ca­men­te 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 de­sti­na­zio­ne. 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 de­sti­na­zio­ne, o entrambi, sono so­sti­tui­ti 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>

Rap­pre­sen­tia­mo di seguito la specifica ‘<utente>@<host>‘ a titolo esem­pli­fi­ca­ti­vo 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 fun­zio­na­men­to del comando SCP è con­trol­la­to da varie opzioni. Di seguito vi mostriamo una selezione delle opzioni più utili:

Opzione Si­gni­fi­ca­to Commento
-C Utilizza la com­pres­sio­ne (com­pres­sion) Non con­fon­de­re con l’opzione ‘-c’ (cipher), che imposta il metodo di crit­to­gra­fia
-p Tra­sfe­ri­sce gli attributi dei file ai file di de­sti­na­zio­ne (per­mis­sions) Non con­fon­de­re con l’opzione ‘-P’ che imposta la porta di rete
-r Copia le directory in modo ricorsivo (recursive) -
-v Vi­sua­liz­za l’output esteso (verbose) -
-q Sopprime l’output (quiet) -
-3 Invia i dati at­tra­ver­so il sistema locale (third party) -
Consiglio

Per una de­scri­zio­ne det­ta­glia­ta di tutte le opzioni di­spo­ni­bi­li, 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 spe­ci­fi­ca­re file e directory. Data la vasta gamma di possibili scenari di ap­pli­ca­zio­ne, vi il­lu­stria­mo 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’ope­ra­zio­ne di copia, è suf­fi­cien­te scambiare i percorsi locale e remoto. Nel primo esempio, usiamo il punto ‘.’ per spe­ci­fi­ca­re la directory corrente come de­sti­na­zio­ne:

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

Di seguito ri­por­tia­mo una va­ria­zio­ne del primo esempio e copiamo il file nella cartella ‘Desktop’ nella cartella utente, sim­bo­leg­gia­ta dalla tilde ‘~’. Si noti che quando si usa la tilde la cartella utente locale viene so­sti­tui­ta. Per evitare errori, un percorso con tilde dovrebbe essere racchiuso tra vir­go­let­te:

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

Se vogliamo copiare il file e salvarlo con un nome diverso, spe­ci­fi­chia­mo il nuovo nome alla fine del percorso di de­sti­na­zio­ne:

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

Copiare più file

Se avete di­me­sti­chez­za con l’uso del comando CP, magari già so­spet­ta­te che sia possibile anche copiare più file con il comando SCP. Il modo più semplice per svolgere questa ope­ra­zio­ne è quello di elencare i file uno a uno. Nell’esempio riportato di seguito, i file spe­ci­fi­ca­ti si trovano nella directory corrente; non abbiamo quindi bisogno di spe­ci­fi­ca­re il percorso di ogni singolo file:

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

Fate at­ten­zio­ne quando usate “wildcard” e “globs” come ‘?’ e ‘*’. Anche se risultano comodi per rendere compatti i modelli nei nomi dei file, possono portare a errori ina­spet­ta­ti 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 al­ter­na­ti­vo.

Copiare un’intera directory

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

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

Dopo un’ese­cu­zio­ne riuscita con successo, tutti i file e le sot­to­di­rec­to­ry nella directory ‘directory’ si trovano come copia sull’host al percorso ‘/percorso/alla/directory’.

Per tra­sfe­ri­re file più grandi, è utile usare l’opzione ‘-C’, che comprime i file per il tra­sfe­ri­men­to:

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

Tenete presente che SCP tra­sfe­ri­sce sempre tutti i file com­ple­ta­men­te. Se il tra­sfe­ri­men­to si in­ter­rom­pe, bisogna ri­co­min­cia­re tutto da capo. Per copiare grandi directory o quando la con­nes­sio­ne di rete è instabile, potrebbe essere opportuno ricorrere a uno strumento al­ter­na­ti­vo.

Copiare un file tra due sistemi remoti

Per copiare un file tra due host, usiamo il comando SCP senza spe­ci­fi­ca­re un percorso locale. I percorsi di origine e de­sti­na­zio­ne devono contenere in­for­ma­zio­ni 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 in­stra­da­re il tra­sfe­ri­men­to at­tra­ver­so 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. Ana­lo­ga­men­te alla di­stin­zio­ne 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 fa­cil­men­te da soli usando metodi comuni.

Esa­mi­nia­mo prima l’ope­ra­zio­ne di spo­sta­men­to, che è composta da una copia e poi da una can­cel­la­zio­ne. Im­ple­men­tia­mo questa sequenza di ope­ra­zio­ni sulla riga di comando com­bi­nan­do i comandi ‘scp’ e ‘rm’, quest’ultimo usato per can­cel­la­re un file. Con­ca­te­nia­mo 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 as­si­cu­ria­mo che la copia sia stata creata sull’host prima che l’originale locale venga can­cel­la­to.

Ultimo ma non meno im­por­tan­te, usiamo un ciclo ‘for’ per pro­ces­sa­re tutti i file che si trovano nella directory corrente. Op­zio­nal­men­te, spe­ci­fi­chia­mo 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 in­for­ma­zio­ni ag­giun­ti­ve sullo stato con l’opzione ‘-v’.

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

Al­ter­na­ti­ve al comando SCP di Linux

Anche se SCP è di­spo­ni­bi­le su quasi tutti i sistemi, non è più il metodo preferito per copiare file sulla rete. Lo sot­to­li­nea­no anche gli svi­lup­pa­to­ri del progetto OpenSSH, che ospita SCP. Le al­ter­na­ti­ve SFTP (Secure File Transfer Protocol) e Rsync (Remote Sync), nominate dai ma­nu­ten­to­ri di SCP, usano anche SSH per l’accesso criptato all’host remoto. Entrambe offrono fun­zio­na­li­tà superiori e sono in fase di sviluppo attivo. L’unico serio svan­tag­gio di questi strumenti è che potrebbe essere ne­ces­sa­rio in­stal­lar­li prima, mentre SCP è pre­in­stal­la­to su quasi tutti i sistemi. Vediamo più da vicino queste al­ter­na­ti­ve.

SFTP è più o meno il suc­ces­so­re diretto di SCP. Il tra­sfe­ri­men­to dei dati è garantito da crit­to­gra­fia e utilizza l’in­fra­strut­tu­ra 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 pro­to­col­lo SFTP offre una gamma di funzioni molto più alta di SCP. La cor­ret­tez­za dei dati tra­sfe­ri­ti viene con­trol­la­ta au­to­ma­ti­ca­men­te ed è possibile ri­pren­de­re i tra­sfe­ri­men­ti in­ter­rot­ti.

Con Rsync è di­spo­ni­bi­le 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 è spe­cial­men­te pro­get­ta­to per il tra­sfe­ri­men­to ef­fi­cien­te di grandi file e quantità di dati. A tal scopo, Rsync confronta i dati presenti sull’origine e sulla de­sti­na­zio­ne e tra­sfe­ri­sce solo la dif­fe­ren­za. Se un tra­sfe­ri­men­to viene in­ter­rot­to e riavviato, non è ne­ces­sa­rio ri­co­min­cia­re dall’inizio.

In sintesi

Se di­spo­ni­bi­li sul vostro sistema, dovreste usare gli strumenti SFTP o Rsync invece di SCP per copiare i file sulla rete.

Vai al menu prin­ci­pa­le