Menu Chiudi

Copiare file e cartelle Linux in rete con ssh e tar

copiare file e cartelle con tar e ssh

L’uso della combinazione di comandi ssh e tar, da riga di comando è un eccellente modo per copiare file ed intere directory tra sistemi Linux. Conoscere questi due fondamentali strumenti dell’universo GNU Linux semplifica non poco la vita del Sysadmin.

Quante volte è capitato di dover copiare file oppure intere cartelle tra server avendo a disposizione solo un terminale con linea di comando?

Vedremo tra breve come utilizzare l’accoppiata vincente del comando tar e del comando ssh per copiare singoli file ed intere cartelle tra due sistemi, attraverso una connessione di rete.

Amministrare sistemi GNU Linux significa riuscire a sfruttare al massimo la potenza e l’efficienza dei comandi da terminale. In questo post approfondiremo come utilizzare al meglio la versione GNU del comando tar e di come può essere utilizzato congiuntamente al comando ssh.

Garantire la sicurezza necessaria per il trasferimento dati attraverso la connessione di rete tra i 2 server, è doveroso. Per farlo, negli esempi abbiamo adottato la configurazione di sicurezza di cui abbiamo già parlato qui.

1. Creare un archivio (Tar) su un server remoto

Dal server hotrain, come utente user (non root), si vuole creare un file di archivio in formato tar, contenente l’intero contenuto della directory locale /var/log/samba che venga salvato direttamente nella directory /home/ronnie dello user ronnie, sul server di destinazione deblika.diprimio.lan.

La sintassi del comando è la seguente

sudo tar czf - /var/log/samba | ssh ronnie@deblika.diprimio.lan 'cd /home/ronnie && dd of=var_log_dir.tar.gz'

In alternativa, se il comando tar non è in grado di creare file compressi, potremo utilizzare il comando seguente, che ha lo stesso significato:

sudo tar cf - /var/log/samba | gzip | ssh ronnie@deblika.diprimio.lan 'cd /home/ronnie && dd of=var_log_dir_other.tar.gz'

Notare che nel secondo esempio abbiamo utilizzato gzip che prende dalla pipe l’output del tar ed invia l’output (compresso) al server remoto via ssh che esegue il comando dd; quest’ultimo prende lo stream di input da ssh ed invia l’output direttamente nel file var_log_dir_other.tar.gz.

2. Creare un archivio (Tar) da un server remoto

Dal server locale hotrain, come utente user (non root), si vuole creare un file tar locale, contenente l’intero contenuto della directory /Storage del server remoto deblika.diprimio.lan, e che venga salvato direttamente nella directory locale /home/user sul server locale hotrain.

La sintassi del comando è la seguente:

ssh ronnie@deblika.diprimio.lan 'cd /Storage && tar cf - Projects | gzip' > var_www_dir.tar.gz

Nell’esempio qui sopra, potrebbe essere richiesta la password dell’utente ronnie dal server remoto deblika.diprimio.lan; questo accade se non è stata installata la chiave pubblica dell’utente user del server remoto per l’utente ronnie.

3. Estrazione di un file Tar locale e copiare su server remoto

Dal server locale hotrain, come utente user (non root), si vuole estrarre il contenuto del file tar locale /home/user/my_tar_file.tar.gz, nella directory /Storage/Repository del server remoto deblika.diprimio.lan, con l’utente ronnie, del server remoto.

Leggi anche:   Come Trasferire Raspbian su SD per Raspberry Pi

La sintassi del comando è la seguente:

dd if=my_tar_file.tar.gz | ssh ronnie@deblika.diprimio.lan "cd /Storage/Repository && tar xfz -"

Notare l’uso del comando dd che “legge” il file my_tar_file.tar.gz in input ed invia l’output alla pipe; esso è molto più efficiente del comando cat e non è influenzato dal locale del sistema.

Notare inoltre che la scrittura dei file estratti dal file tar non avviene nel server locale, la scrittura dei file avviene infatti esclusivamente sul server remoto, a conferma che non v’è alcuna inutile occupazione di spazio sul server locale.

4. Estrazione di un file Tar Remoto e copiare nel server locale

Nel server locale hotrain, come utente user (non root), si vuole estrarre il contenuto del file tar remoto Container.tar.gz, nella cartella locale /Stock; il file tar di origine risiede nella directory /Storage/Projects del server remoto deblika.diprimio.lan, il cui proprietario è l’utente ronnie, del server remoto.

La sintassi del comando è la seguente:

cd /Stock
ssh ronnie@deblika.diprimio.lan "dd if=/Storage/Projects/Container.tar.gz" | tar xfz -

Notare l’uso dei doppi apici «”» per racchiudere il comando da eseguire sul server remoto e far in modo che si possa successivamente passare lo stream di dati tramite la pipe al server locale.

Notare inoltre che la scrittura dei file estratti dal file tar non avviene nel server remoto; la scrittura dei file avviene infatti esclusivamente sul server locale, a conferma che non v’è alcuna inutile occupazione di spazio nel server remoto.

5. Copiare (backup) un Hard Disk locale in un file su server remoto

Dal server locale hotrain, come utente user, si vuole eseguire il backup di un intero disco nel file remoto /Storage/hotrain_sdb.img.gz (compresso) del server remoto deblika.diprimio.lan.

La sintassi del comando è la seguente

sudo umount /dev/sdb1 # smonta tutte le partizioni
sudo dd if=/dev/sdb bs=1M | \
    gzip | \
    ssh ronnie@deblika.diprimio.lan "dd of=/Storage/hotrain_sdb.img.gz"
sudo mount /dev/sdb1 /Data # monta tutte le partizioni

Notare che tutti i filesystem del disco che di cui si vuole fare il backup devono essere preventivamente “smontati” (la copia del filesystem sarebbe incoerente). Potranno essere rimontati dopo il completamento della copia

Leggi anche:   Come configurare WireGuard VPN con Linux

Inoltre, da notare l’utilizzo di sudo. Qui viene utilizzato per la lettura del device /dev/sdb, indispensabile quando si maneggiano i device e per tutti i comandi privilegiati.

6. Copiare (ripristino) di un Hard Disk locale da un file su server remoto

Nel server locale hotrain, come utente user, si vuole eseguire il ripristino di un intero disco dal file remoto /Storage/hotrain_sdb.img.gz (compresso) dal server remoto deblika.diprimio.lan.

La sintassi del comando è la seguente

sudo umount /dev/sdb1 # smonta tutte le partizioni
ssh ronnie@deblika.diprimio.lan \
    "dd if=/Storage/hotrain_sdb.img.gz | \
    gunzip" | \
    sudo dd of=/dev/sdb
sudo fsck -f /dev/sdb1 # Controlla la coerenza delle partizioni
sudo mount /dev/sdb1 /Data # Monta i filesystem del disco ripristinato

Notare come anche qui tutti i filesystem del disco che di cui si vuole fare il ripristino dovrebbero essere preventivamente smontati (qualora ve ne siano).

Notare anche l’utilizzo di sudo per la scrittura nel device /dev/sdb (indispensabile quando si maneggiano i device) e per tutti i comandi privilegiati.

Inoltre, notare che al termine del ripristino, viene eseguito il comando fsck (filesystem check) per assicurarsi che i filesystem ripristinati non siano danneggiati.

Conclusioni

In ambiente GNU Linux, i comandi tar e ssh, e spesso anche il comando dd, possono essere utilizzati per copiare files ed intere cartelle e hard disk in modo estremamente semplice, efficace e sicuro; di conseguenza tali comandi possono essere impiegati anche per fare il backup dei dati su server remoti.

L’efficienza e la flessibilità del comando tar permette di mantenere inalterati le caratteristiche dei file originali (permessi, ownership, ecc); quindi è il miglior candidato per la copia dei file conservando intatti dati e metadati di file e cartelle.

Allo stesso tempo, la sicurezza del trasferimento dei dati in rete è assicurata dalla cifratura di ssh, sfruttando la cifratura dei dati nel canale di comunicazione tra sistemi.

Leggi anche:   Installare Ubuntu 14.04 LTS a fianco di Windows

Condividi

Lascia un commento