Articles

Trasferire file tra macchine Linux su SSH

Panoramica

A volte vogliamo trasferire file da una macchina Linux all’altra in modo sicuro. Forse vogliamo caricare alcuni file su un server di produzione o fare un backup.

In questo articolo, vedremo diversi strumenti per trasferire file tra macchine Linux su ssh, il protocollo più popolare per la connessione remota tra macchine Linux.

Guarderemo i due strumenti di trasferimento file più popolari: scp e rsync.

Uso di base dello strumento

2.1. Un rapido esempio

Immaginiamo di voler copiare il file text.log dal nostro sistema locale al percorso /var/log su un server Linux remoto all’indirizzo IP 111.111.111.111, e vogliamo usare le credenziali dell’utente root.

Questo può essere ottenuto con scp o rsync usando la stessa sintassi di base:

scp text.log :/var/logrsync text.log :/var/log

Comprendiamo cosa questi comandi hanno in comune prima di imparare le loro variazioni e differenze.

2.2. La sintassi generale

La sintassi generale per scp o rsync è:

scp/rsync ]Source_File ]Destination_file

La sezione OPTION ci permette di usare degli switch della linea di comando per modificare il comportamento dell’operazione di copia. I due percorsi per sorgente e destinazione ci permettono di specificare il percorso del file su entrambi i lati dell’operazione di copia, così come l’account o gli account utente da utilizzare.

Nell’esempio precedente, il file locale viene copiato in una posizione remota – . Come vedremo più avanti, possiamo usare il formato remoto per descrivere la sorgente o la destinazione, permettendo a questi comandi di caricare file su un server e scaricare file da un server.

2.3. Cose importanti da notare

Ci sono pochi punti da ricordare quando trasferiamo file su ssh usando qualsiasi strumento:

  • Il comando scp/rsync chiederà la password dell’utente per accedere al server remoto se non abbiamo impostato l’auto-login con lo scambio di chiavi RSA
  • Non abbiamo bisogno di fornire il nostro nome utente o l’IP del server locale
  • Possiamo fornire un percorso assoluto o relativo al file sorgente/destinazione, dove i percorsi relativi sono relativi alla directory di lavoro corrente o alla home directory dell’utente remoto

2.4. Specificare un nome di file

Non è obbligatorio fornire un nome di file nel percorso di destinazione. Se non forniamo un nome di file, verrà usato il nome del file sorgente.

Nel nostro primo esempio, il file verrà creato nella directory di destinazione con il nome text.log. Se avessimo voluto che il file fosse memorizzato con un nome diverso, avremmo potuto fornire un nome di file come parte del percorso di destinazione.

Utilizzando il nome di file implicito, possiamo copiare un file dal server Linux remoto nella directory corrente con il suo nome originale:

scp :/var/log/text.log .rsync :/var/log/text.log .

Qui, il parametro “.” rappresenta la directory di lavoro corrente. Possiamo anche fornire un percorso diverso se vogliamo:

scp :/var/log/text.log /opt/path/mytextlog.logrsync :/var/log/text.log /opt/path/mytextlog.log

2.5. Copiare tra server

Possiamo anche usare questi strumenti per copiare tra due server remoti. Per esempio, copiamo il file text.log dal server 111.111.111.111. al server 222.222.222.222 per l’utente root:

scp :/var/log/text.log :/var/logrsync :/var/log/text.log :/var/log

Ora che abbiamo una conoscenza di base di scp e rsync, guardiamoli più in profondità.

scp (Secure Copy)

scp sta per Secure Copy ed è usato per trasferire file su una connessione ssh. È una copia grezza, il che significa che leggerà semplicemente i dati dalla cartella di origine e li scriverà nella cartella di destinazione. Quindi, se stiamo cercando una copia veloce che non dovrebbe richiedere più di qualche minuto, allora dovremmo scegliere scp.

Se stiamo trasferendo un file grande, dovremmo assicurarci di avere una connessione internet stabile. Dato che scp non è riassumibile, il tempo può essere perso se la connessione cade durante un grande trasferimento, e l’intera operazione di copia dovrà essere riavviata.

3.1. Installazione

La maggior parte delle distribuzioni Linux hanno scp preinstallato. Possiamo facilmente controllare se scp è installato o meno:

which scp

Vedremo il percorso del comando scp se è già installato. Una risposta vuota significa che scp non è installato.

Se non ce l’abbiamo già, allora per installare scp, dobbiamo installare il pacchetto client OpenSSH dal repository ufficiale dei pacchetti:

sudo apt-get install openssh-clients # For Debian based systems like Ubuntu sudo yum install openssh-clients # For Red Hat based systems like CentOS and Fedora

Andiamo attraverso alcuni scenari comuni per l’utilizzo di scp.

3.2. Trasferire file multipli

Possiamo fornire una lista di file separati da uno spazio per trasferire file multipli:

scp text.log text1.log text2.log :/var/log

Possiamo anche usare l’opzione -r per copiare ricorsivamente l’intera directory. Per esempio, per copiare tutti i file dalla directory /home/app/log/:

scp -r /home/app/log :/var/log

Possiamo usare * per inviare i file che corrispondono a un particolare schema di nomi. Per esempio, abbiamo quattro file text.log, text2.log, app.log e app2.log, e vogliamo inviare solo i file che iniziano con app:

scp /home/app/log/app* :/var/log

3.3. Trasferire file usando i file di identità

L’autenticazione basata su chiave è preferita nella maggior parte delle distribuzioni Linux. Nel comando scp, possiamo specificare il file di identità usando l’opzione -i:

scp -i key.pem text.log :/var/log

Molti amministratori di sistema usano l’autenticazione basata su chiave per trasferire i file poiché non richiede le credenziali dell’utente ad ogni trasferimento.

3.4. Compressione al volo

Possiamo ridurre il tempo di trasferimento usando la compressione al volo con l’opzione -C. Questo comprimerà e decomprimerà il file nei percorsi sorgente e destinazione rispettivamente:

scp -C text.log :/var/log

3.5. Limitare la larghezza di banda durante il trasferimento

Possiamo specificare la larghezza di banda in Kbit/s con l’opzione -l:

scp -l 500 text.log :/var/log

3.6. Modalità verbosa per il debug

Possiamo abilitare la modalità verbosa con l’opzione -v:

scp -v text.log :/var/log

L’output sarebbe qualcosa di simile:

Executing: program /usr/bin/ssh host prod-reporting-b, user jain, command scp -v -t /tmp OpenSSH_7.9p1, LibreSSL 2.7.3 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 48: Applying options for * debug1: Connecting to prod-reporting-b port 22. debug1: Connection established. ------ Transferred: sent 2856, received 2932 bytes, in 2.1 seconds Bytes per second: sent 1366.8, received 1403.1 debug1: Exit status 0

L’output verboso (debug) stampa i passi esatti che scp sta eseguendo, il che è utile per il debug di connessioni, autenticazione e problemi di configurazione.

rsync (Sincronizzazione remota)

rsync è veloce e versatile. È buono per sincronizzare e trasferire i file in modo intelligente perché tiene traccia di quanti dati sono stati copiati e quanti ne rimangono.

Si dovrebbe usare rsync quando si hanno grandi file da trasferire – anche se ci sono problemi di connessione di rete, i dati copiati fino a quel punto non saranno persi, e quando la connessione viene ripristinata, la copia riprenderà da quel punto.

rsync è più veloce del comando scp quando dobbiamo trasferire lo stesso file più volte poiché utilizza un protocollo di aggiornamento remoto, che permette di trasferire solo le differenze tra due serie di file.

4.1. Installazione

Controlliamo se rsync è installato invocandolo per mostrare la sua versione:

rsync --version

Se otteniamo un errore, allora possiamo installarlo:

sudo apt-get install rsync # For Debian based systems like Ubuntu sudo yum install rsync # For Red Hat based systems like CentOS and Fedora

Andiamo attraverso alcuni scenari comuni dove possiamo usare rsync.

4.2. Fare una prova a secco

Siccome rsync è così potente, può essere pericoloso usarlo senza controllare cosa sta per fare. Fortunatamente, rsync fornisce l’opzione -dry-run, che esegue una prova senza trasferire effettivamente i file:

rsync --dry-run text.log :/var/log

4.3. Copiare gli attributi e i metadati

rsync fornisce l’opzione -a, che copia i link simbolici, i tempi di modifica, il gruppo, la proprietà e i permessi insieme al contenuto del file.

Un’altra importante opzione è -h, che stamperà l’output in una forma leggibile per l’uomo. Questo può essere particolarmente utile quando viene eseguito insieme all’opzione -dry-run:

rsync -ah --dry-run text.log :/var/log

4.4. Trasferire più file in una directory

Possiamo fornire una lista di file separati da uno spazio per trasferire più file:

rsync text.log text1.log text2.log :/var/log

L’opzione -r copia ricorsivamente tutti i file nella directory:

rsync -r /home/app/log :/var/log

L’operatore * invia i file che corrispondono a un particolare schema:

rsync /home/app/log/app* :/var/log

Possiamo usare l’opzione -include e l’opzione -exclude per includere ed escludere i file dalla lista dei file presenti nella directory. Ad esempio, per inviare tutti i file di una directory escludendo quelli che iniziano con ‘R’:

rsync --include '*' --exclude 'R*' text.log :/urs/log

4.5. Compressione al volo

Possiamo ridurre il tempo di trasferimento usando la compressione al volo con l’opzione -z. Questo comprimerà e decomprimerà i file nei percorsi di origine e destinazione rispettivamente:

rsync -z text.log :/var/log

4.6. Elimina i file esistenti nel percorso di destinazione prima del trasferimento

L’opzione -delete elimina i file esistenti dalla destinazione prima di trasferire nuovi file:

rsync --delete text.log :/var/log

4.7. Rimuovere automaticamente i file sorgente dopo il trasferimento

Diciamo che vogliamo fare un backup dei log dal server di produzione a un server di backup. In questo scenario, probabilmente vorremmo rimuovere i file dal server di produzione dopo aver trasferito tutti i file al nostro server di backup.

rsync server fornisce l’opzione -remove-source-files per rimuovere i file sorgente dopo che il trasferimento è stato completato:

rsync --remove-source-files text.log :/var/log

Quale strumento scegliere?

Possiamo usare entrambi questi strumenti per trasferire file tra macchine Linux. Tuttavia, dovremmo considerare scp quando la dimensione del file è piccola – è uno strumento di copia semplice ed è ampiamente disponibile. Nel nostro uso quotidiano, scp è la scelta più facile per piccoli trasferimenti una tantum.

Potremmo beneficiare maggiormente di rsync quando la dimensione dei file è grande o quando abbiamo bisogno di una sincronizzazione più complessa ed efficiente. È anche la scelta migliore per compiti ricorrenti come i cron job e gli script.

Conclusione

In questo articolo, abbiamo esaminato due strumenti per il trasferimento di file: scp e rsync.

Abbiamo anche esaminato le differenze tra loro, e quali strumenti si adattano a determinati casi d’uso.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *