Uno dei vantaggi di Linux/UNIX è avere a disposizione tanti modi per fare una cosa. Questa guida mostra come si può trasferire dei file attraverso una connessione di rete. I metodi analizzati sono rsync, scp e tar. Si prega di notare che questi non sono gli unici, ma semplicemente i più comuni. Si dà per scontata la presenza di SSH su entrambe le parti, il vantaggio è quello di avere metodologie più sicure ed affidabili rispetto a rcp e ftp.
scp
scp (secure copy) è probabilmente il più facile dei metodi, è stato progettato come sostituto di rcp, una veloce copia di cp con funzionalità di rete.
Sintassi di scp:
scp [-Cr] /some/file [ more ... ] host.name:/destination/file
-oppure-
scp [-Cr] [[[email protected]]host1:]file1 [ more ... ] [[[email protected]]host2:]file2
Prima di ogni cosa avviene la connessione in ssh. Se non sono state configurate le chiavi, verranno chiesti gli usernames. Si può testare la cosa con ssh -v hostname
L’opzione -r è usata per copiare ricorsivamente tutte le directory. Affinché il tutto funzioni, il file sorgente va specificato come directory.
scp esegue la criptazione dei dati che viaggiano attraverso la connessione, ma usando l’opzione -C viene eseguita anche una compressione prima del trasferimento, un’operazione che può abbattere significativamente i tempi di trasferimento di grandi file.
Suggerimento: di norma scp usa l’algoritmo di criptazione 3DES. Tutti gli algoritmi di questo tipo sono lenti, ma alcuni lo sono meno degli altri: usare -c blowfish può accelerare il processo.
scp non va usato in questi casi:
- quando i file da copiare non sono pochi, perché scp crea un nuovo processo per ogni file e questo può tradursi in pessime prestazioni quando i file sono in numero eccessivo
- usando l’opzione -r, scp segue ciecamente i link simbolici, anche se ha già copiato i file. Il quantitativo di dati passati al destinatario può crescere in maniera imprevedibile, quindi serve attenzione
rsync
rsync ha una sintassi simile a quella di scp:
rsync -e ssh [-avz] /some/file [ more ... ] host.name:/destination/file
-oppure-
rsync -ave ssh source.server:/path/to/source /destination/dir
La peculiarità di rysnc consiste nella sua abilità di analizzare i file e copiare solo le differenze. Questo può portare ad enormi miglioramenti quando si vuole aggiornare la copia di un albero di directory.
Opzioni:
-a Modalità di archiviazione, di solito viene usata sempre. Vengono preservati i permessi e non vengono seguiti i link simbolici.
-v Verboso, vengono elencati i file che vengono copiati
-z Abilitazione della compressione, che può essere utile in certi tipi di file
-e ssh Viene usato ssh per il trasporto, andrebbe sempre specificata
Alcuni svantaggi di rsync
- Sintassi ostica
- Doversi ricordare di usare ssh
- Non tutte le macchine hanno rsync installato
tar
tar viene di solito usato da applicazioni di archiviazione, ma ciò che faremo in questo caso è la redirezione dell’output verso una connessione ssh. tar sa come destreggiarsi con alberi di directory grandi e complessi e mantiene tutti i permessi, anche in sistemi UNIX con ACL, e funziona bene con i link simbolici.
La sintassi da usare nel nostro caso è:
tar -cf - /some/file | ssh host.name tar -xf - -C /destination
– oppure, abilitando la compressione –
tar -czf - /some/file | ssh host.name tar -xzf - -C /destination
L’opzione -c crea l’archivio e -f lo spedisce direttamente in stdout.
Il secondo tar del comando usa lo switch -C per cambiare directory sull’host ricevente. L’input viene preso dallo stdin. Il -x serve per l’estrazione.
Come nei casi precedenti, si può usare la compressione per cercare di abbattere il tempo di trasferimento.
Qualcuno potrebbe chiedere come mai usare tar, la risposta è semplice: in rete viene praticamente trasferito un unico file, e si riduce l’overhead di connessione.
Se si desidera usare l’opzione -v, è sufficiente metterla solo da una parte, altrimenti l’output si ripete.
Il tar in piping può rappresentare un’opzione vincente per mantenere i permessi anche in copie locali:
tar cf - /some/file | (cd /some/file; tar xf -)
In questo caso chiaramente non ha molto senso comprimere i file: si tratta di una semplice copia sullo stesso hard disk e il prezzo da pagare in termini di CPU è alto.
Quando va evitato tar?
- Quando non si riesce a ricordare la sua sintassi
- Non è veloce quanto scp per un numero di file basso
- rsync vince a man bassa quando dobbiamo solo aggiornare un albero di directory già esistente sulla destinazione
Altri metodi come NAS e NFS richiedono la presenza di software particolari, quindi in questa occasione non ha senso trattarli.
Articolo liberamente tradotto. Titolo originale: How to Copy Files Across a Network/Internet in UNIX/LINUX (Redhat, Debian, FreeBSD, etc) – scp tar rsync
Nota: avendo a disposizione solo FTP sul server che rappresenta il nostro mittente, si può ricorrere a wget (grazie Gianluca Zamagni):
vi .wgetrc && wget -m ftp://sitochedeviscaricare/httpdocs
In pratica wget va a cercare eventuali opzioni esistenti in un file nascosto, .wgetrc, quindi assicuriamoci che non esista o sia vuoto nella directory in cui ci troviamo. L’opzione -m crea e mantiene aggiornato un albero di directory, ha però un comportamento che può essere fastidioso: se il file di origine è più vecchio ma quello di destinazione ha comunque una diversa dimensione, il trasferimento viene eseguito. A volte può capitare infatti che il server FTP e il sistema operativo calcolino due differenti dimensioni per file che hanno lo stesso identico contenuto, quindi può capitare di scaricare sempre e comunque lo stesso albero di directory.
UPDATE: molto più comodo di wget per questo scopo è lftp.
Ottimo articolo…grazie !!!!