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.
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
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.
CondividiDisclaimer
Questa pagina potrebbe contenere link di affiliazione. Gli acquisti o gli ordini che effettuerai tramite tali link possono generare commissioni che ci aiutano a sostenere questo sito web.