Il modo migliore per trasferire file su una LAN tra due computer Linux


77

Voglio trasferire file (una cartella musicale) tra due computer Linux. Dopo aver cercato il modo migliore per farlo, ho visto che ci sono molti modi per farlo. So che è stato chiesto molto , ovunque e in ogni momento . Il problema principale è che non esiste un chiaro consenso recente su un modo migliore per eseguire questa attività nel 2011 per i principianti di Linux (anche a seconda di alcuni parametri).

Quindi, nello spirito dei siti Web di Stack Exchange, voglio che questo non sia correlato alla mia situazione particolare, ma piuttosto una guida per gli altri e su come trasferire file tra due computer Linux su una rete locale. Penso che un wiki sarebbe utile per molti.

Ecco cosa ho trovato finora:

  • SSH
  • sshfs
  • SCP
  • sftp
  • nfs
  • samba
  • donatore

Qual è il più semplice? Più flessibile? Più semplice? Soluzione migliore? Quali sono i pro ed i contro di ognuno? Ci sono altre (migliori) opzioni? Quali sono i parametri nella scelta del metodo migliore (la soluzione potrebbe dipendere dal numero di file, dimensione, facilità rispetto a flessibilità, ...)?


2
Qualcuno potrebbe spiegare dove rsync viene a giocare in tutto questo?
Konerak,

jonallard, per favore non aggiungere le risposte alla domanda (non ha davvero senso farlo, vero?) - se ritieni che alcune risposte abbiano bisogno di informazioni aggiuntive, puoi suggerire delle modifiche o creare la tua risposta che riassume tutto!
slhck,

Risposte:


65

In un ambiente Linux, sia per la sicurezza che per la facilità d'uso, ssh è il modo migliore di procedere. SSH, SSHFS, SCP e SFTP, come elencato, sono solo servizi diversi basati sul protocollo SSH. SCP è molto facile da usare, funziona proprio come CP ma è possibile fornire nomi utente e macchina nel percorso. Quindi, potremmo fare un CP simile cp ~/music/ ~/newmusic/, ma potremmo fare altrettanto facilmente scp ~/music/ user@host:~/newmusicper inviarlo al computer chiamato host. Ecco fatto: non è necessario impostare nulla. Ti verrà richiesta la password dell'account sull'altro computer se non hai impostato il certificato o qualche altra autenticazione (ovviamente scp condivide queste impostazioni con ssh).

SFTP è uno strumento che semplifica l'esecuzione di molte operazioni su un file system remoto: funziona esattamente come FTP, ma funziona tramite SSH, quindi è sicuro e richiede solo un server SSH. man sftpti dirà tutto su come usarlo. Non uso SFTP solo per spostare una cartella tra due macchine, è più utile quando hai molte operazioni da fare, come se stai riordinando i file su un altro computer.

SSHFS estende SFTP a un file system: ti consente di montare un host virtuale sul tuo file system, in modo che le cose di rete avvengano in modo totalmente trasparente. SSHFS è per configurazioni semi-permanenti, non solo per il trasferimento di file una tantum. Ci vuole un po 'più di sforzo per iniziare, di cui puoi leggere sul sito web del progetto .

Se devi lavorare in un ambiente con sistema operativo misto, Samba diventa la tua prossima scommessa migliore. Windows e OS X supportano Samba in modo completamente automatico, e Linux lo fa anche se a volte è difficile da usare.


3
Esattamente il tipo di risposta che desideravo: completa, esaustiva, dettagliata, al punto.
jonallard,

2
Una cosa però, per scpfunzionare, dobbiamo impostare una sorta di server ssh, listener o sbloccare qualcosa dall'altra parte? Ricevo errori "Connessione rifiutata".
jonallard,

2
scp usa ssh, quindi funzionerà se SSH funziona. Ciò significa, ovviamente, che è necessario disporre di un server SSH in esecuzione (impostazione predefinita in ogni distro linux di cui sono a conoscenza) e deve essere possibile una connessione (firewall, NAT, ecc. Devono avere le eccezioni appropriate).
jcrawfordor,

8
Apparentemente openssh-serverdeve essere installato in Ubuntu Natty.
jonallard,

3
Si noti che sshutilizza la crittografia, che causerà un sovraccarico aggiuntivo. Se i computer coinvolti hanno CPU abbastanza lente, questo potrebbe fare la differenza. In quel caso netcato simile (vedi la risposta di Caspar) potrebbe essere preferibile. Naturalmente solo se in realtà non è necessaria la crittografia (in una LAN protetta).
sleske,

59

Il mio preferito per i casi in cui la sicurezza non conta è netcat + tar :

Per inviare una directory, cd all'interno della directory i cui contenuti si desidera inviare sul computer facendo l'invio e fare:

tar -cz . | nc -q 10 -l -p 45454

Sul computer che riceve i contenuti, cd nel punto in cui si desidera visualizzare i contenuti ed eseguire:

nc -w 10 $REMOTE_HOST 45454 | tar -xz

Sostituisci $REMOTE_HOSTcon ip / hostname del computer che esegue l'invio. È inoltre possibile utilizzare una porta diversa anziché 45454.

Quello che sta realmente accadendo qui è che il computer "ricevente" si sta collegando al computer di invio sulla porta 45454 e sta ricevendo il contenuto tar'd e gzip della directory e lo sta passando direttamente a tar (e gzip) per estrarlo in la directory corrente.

Esempio rapido (utilizzo di localhost come host remoto)

Computer 1

caspar@jumpy:~/nctest/a/mydir$ ls
file_a.txt  file_b.log
caspar@jumpy:~/nctest/a/mydir$ tar -cz . | nc -q 10 -l -p 45454

Computer 2

caspar@jumpy:~/nctest/b$ ls
caspar@jumpy:~/nctest/b$ nc -w 10 localhost 45454 | tar -xz
caspar@jumpy:~/nctest/b$ ls
file_a.txt  file_b.log

mi ricorda un po 'sendnet e recnet dai servizi ipx di Novel dei vecchi tempi ...
sum1stolemyname

4
## netcat + bzip2 potrebbe essere un po 'più veloce su connessioni lente ## Invio server # cat file.txt | bzip2 -c | nc -l 1234 ## Server di ricezione # nc $ send_ip 1234 | bzip2 -cd> file.txt
shantanuo

@Caspar: che ne dici di modificare questa risposta per suggerire la compressione bzip2 o lzma?
einpoklum - ripristina Monica il

4
l' -qopzione indica che stai usando openbsd-netcat , mentre gnu-netcat è anche abbastanza comune (impostazione predefinita in Arch Linux ). Potresti estendere la tua risposta per includere la sintassi di gnu-netcat ?
Sebastian

1
L'attuale nc man dice dell'opzione -l: "È un errore usare questa opzione insieme alle opzioni -p, -s o -z", ma stranamente non genera un errore quando lo si usa. Penso che usare 'nc -l 45454' dovrebbe funzionare altrettanto bene.
Claudiu,

19

Per le mosse di una volta, si consiglia scp.

Ma se scopri che questa directory può funzionare e devi spostarla più volte per mantenere l'altra posizione aggiornata, puoi usare rsync (con ssh).

Dato che rsync ha molti argomenti, di solito lo inserisco in una piccola shell, quindi lo capisco bene (ogni volta). L'idea è di inviare solo cose che sono cambiate dall'ultima volta che è stato eseguito.

#!/bin/bash

user="nisse"
host="192.168.0.33"

echo "Sync: /home/media/music/"
rsync --archive --delete -v --progress -e "ssh -l $user " /home/media/music/ $host:/home/media/music/

Questo sposterà una dir chiamata "/ home / media / music /" dal computer locale al pc chiamato 192.168.0.33, usando l'utente "nisse". Elimina tutto sulla destinazione che non esiste sul PC locale.


1
+ per rsync, che sembra un po 'più veloce ed è molto bello se devi sincronizzare la directory in seguito
Wiesław Herr

Sembra molto promettente (e facilmente riutilizzabile) ma ho dirs e file con spazi e sto ricevendo un errore rsync: sintassi o errore di utilizzo (codice 1) su main.c (1348) [mittente = 3.1.1] - - eventuali suggerimenti?
Torben Gundtofte-Bruun,

8

Ti consiglierei di provare alternative invece di andare dritto con SSH per spostare i file all'interno della tua LAN poiché l'overhead è IMMENSE. Andrei con la soluzione di Caspar se questa per qualsiasi motivo non funzionasse per te:

Alla fonte:

$ python3 -m http.server {PICK_YOUR_PORT}

A destinazione:

$ wget -r {ip / hostname}:{port}/{File / Directory}

Questo non sarà solo più leggero dell'utilizzo di SSH ma molto più veloce con velocità comprese tra 45 ~ 65 MiB su UTP CAT6 standard.
Se vuoi davvero spremere il massimo dalla connessione prova a sostituirlo wgetcon lftpe usando pget -n20e i mirror -rcomandi.


7

Il più veloce è probabilmente netcat(come descritto da caspar).

Mi piace la combinazione di tar& ssh, che è sicura e ancora veloce:

Sulla fonte

tar -cf - . | ( ssh user@target && cd /target/path && tar -xf - )

In questo modo come root, conserva i permessi dei file. O utilizzare -psu entrambi i lati. Inoltre -Spotrebbe essere preso in considerazione se si dispone di file sparsi.

È possibile ridurre il sovraccarico di crittografia sshse si utilizza arcfourcome codice che funziona con openSSH:

tar -cpSf - . | ( ssh -c arcfour user@targethost && cd /target/path && tar -xpSf - )

Per aggiornare il percorso remoto, rsyncè perfetto:

rsync -av --sparse --delete -e "ssh -c arcfour" . root@targethost:/target/path

1
FWIW, di recente ho fatto un test di trasferimento tra due laptop moderni collegati direttamente usando rsync sia con l'opzione arcfour che senza argomenti -e specifici. Non ho notato alcuna differenza di velocità.
Randy Syring,

4

Se dovesse assolutamente essere fatto sulla LAN, lo userei rsync, poiché riprenderà da dove si era interrotto se viene interrotto. Ha anche alcuni altri trucchi per ridurre al minimo la quantità di dati che vengono trasferiti, anche se dubito che molti / nessuno di loro sarebbe rilevante nel caso di copiare una libreria musicale in una posizione vergine. Se la sicurezza è un problema, basta impostare RSYNC_RSH=sshprima e i dati verranno incanalati su SSH.

Se lo stessi effettivamente facendo, probabilmente non userei affatto la LAN. Coperei i file su un disco rigido USB, quindi su di esso. Nella mia esperienza, questo può essere facilmente più ordini di grandezza più veloce rispetto alla LAN, nonostante sia necessario copiare i file due volte: USB 2.0 è valutato per 480 Mbps, che è più veloce di qualsiasi altra cosa al di fuori di Gigabit Ethernet, inoltre è meno sensibile alle condizioni che degraderà le prestazioni di una LAN. È anche completamente indipendente dal sistema operativo, a condizione che tu utilizzi un file system che tutte le macchine coinvolte sono in grado di gestire - consiglierei VFAT / FAT32, dal momento che è praticamente universale.


1
Sono anche un fan del (cosiddetto) sneakernet, ma vale la pena sottolineare che mentre l'USB 2 dovrebbe essere in grado di ottenere 480 Mbps, l'ho mai visto solo ottenere 30 MB / s (circa 240 Mb). forse ho solo hardware USB <-> SATA economico;) Inoltre, FAT32 è praticamente universale ma non è un gioco da ragazzi per copiare cose come immagini DVD a causa del vincolo di dimensione del file da 4 GB; vale la pena sottolineare che le persone non sono troppo frustrate dal messaggio di errore "spazio esaurito" dato da Windows (almeno).
Caspar,

@Caspar: buoni avvertimenti! Grazie per averli citati; Dimentico sempre il limite delle dimensioni del file FAT32 ...
Dave Sherohman,

2

Suggerirei rsync in quanto copierà i file in modo incrementale. Puoi configurarlo per copiare solo i file modificati o nuovi solo dopo aver effettuato l'aggiornamento iniziale. Se lo desideri, puoi usare ssh come livello di trasporto.


1

Uso Unison , che è un fantastico sincronizzatore di file su molti protocolli diversi. È possibile configurare in modo da utilizzare scp, rcp, ftpo anche localmente sul filesystem tra due cartelle. Lo uso per sincronizzare la mia libreria musicale, in quanto può trasferire più file contemporaneamente sulla rete ed è davvero sintonizzabile nella sua configurazione. Mantengo il backup della mia raccolta musicale e la sincronizzazione su 2-3 computer. Copia solo i file modificati e lo fa mantenendo un indice su entrambe le estremità del trasferimento in modo da poter dire quando un client ha modificato il file o quando il file del server è cambiato.

Il tuo chilometraggio può variare, ma è sicuramente molto meglio di scptutta la tua raccolta musicale ogni volta che aggiungi una nuova canzone :)


0

Ho seguito prima il processo ssh per l'accesso senza password http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/

Per gli script e i file di testo, per me funziona bene

Per trasferire dati dall'host locale all'host remoto. cat localfile | ssh <user>@<ip> "cat > <path>/<remotefile>"

Per trasferire dati dall'host remoto all'host locale. ssh <user>@<ip> "cat > <path>/<remotefile>" | cat > localfile

Questo funziona per me per trasferire file su sistemi embedded che non hanno client ssh o scp integrati.

No scp - solo ssh.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.