Beste Möglichkeit zum Übertragen von Dateien über ein LAN zwischen zwei Linux-Computern

77

Ich möchte Dateien (einen Musikordner) zwischen zwei Linux-Computern übertragen. Nach der Suche nach dem besten Weg, dies zu tun, habe ich gesehen, dass es viele Möglichkeiten gibt, dies zu tun. Ich weiß , das aufgefordert wurde , eine Menge , überall und die ganze Zeit . Das Hauptproblem dabei ist, dass es in letzter Zeit keinen klaren Konsens darüber gibt, wie Linux-Anfänger diese Aufgabe 2011 am besten bewältigen können (auch in Abhängigkeit von einigen Parametern).

Im Geiste der Stack Exchange-Websites möchte ich, dass dies nicht mit meiner speziellen Situation zusammenhängt, sondern eher als Leitfaden für andere dient, um Dateien zwischen zwei Linux-Computern über ein lokales Netzwerk zu übertragen. Ich denke, ein Wiki wäre für viele nützlich.

Folgendes habe ich bisher gefunden:

  • ssh
  • sshfs
  • scp
  • sftp
  • nfs
  • Samba
  • Geber

Was ist am einfachsten? Am flexibelsten? Am einfachsten? Beste Lösung? Was sind die Vor- und Nachteile von jedem? Gibt es andere (bessere) Möglichkeiten? Was sind die Parameter bei der Auswahl der besten Methode (die Lösung kann von der Anzahl der Dateien, der Dateigröße, der Einfachheit oder der Flexibilität abhängen, ...)?

Jonallard
quelle
2
Könnte jemand erklären, woher rsync kommt, um in all dem zu spielen?
Konerak
jonallard, fügen Sie nicht die Antworten auf die Frage (nicht wirklich Sinn machen , dies zu tun, nicht wahr?) - wenn Sie einige Antworten zusätzliche Informationen benötigen , fühlen, können Sie Änderungen an ihnen vorschlagen, oder Ihre eigene Antwort erstellen was alles zusammenfasst!
Slhck

Antworten:

65

In einer Linux-Umgebung ist ssh aus Sicherheitsgründen und aus Gründen der Benutzerfreundlichkeit der beste Weg. Wie Sie sehen, sind SSH, SSHFS, SCP und SFTP nur verschiedene Dienste, die auf dem SSH-Protokoll aufbauen. SCP ist sehr einfach zu bedienen und funktioniert genau wie CP. Sie können jedoch Benutzer- und Maschinennamen im Pfad angeben. Wir könnten also einen CP wie cp ~/music/ ~/newmusic/, aber wir könnten es genauso einfach tun scp ~/music/ user@host:~/newmusic, um ihn an den Computer mit dem Namen host zu senden. Das war's - wir müssen nichts einrichten. Sie werden zur Eingabe des Kontokennworts auf dem anderen Computer aufgefordert, wenn Sie kein Zertifikat oder keine andere Authentifizierung eingerichtet haben (scp teilt diese Einstellungen natürlich mit ssh).

SFTP ist ein Tool, mit dem viele Vorgänge auf einem Remote-Dateisystem einfach ausgeführt werden können. Es funktioniert genau wie FTP, läuft jedoch über SSH, ist also sicher und erfordert nur einen SSH-Server. man sftpwird Ihnen alles darüber erzählen, wie man es benutzt. Ich verwende SFTP nicht nur zum Verschieben eines Ordners zwischen zwei Computern. Es ist nützlicher, wenn Sie viele Vorgänge ausführen müssen, z. B. wenn Sie Dateien auf einem anderen Computer neu anordnen.

SSHFS erweitert SFTP lediglich in ein Dateisystem: Es ermöglicht Ihnen, einen virtuellen Host in Ihr Dateisystem einzubinden, sodass das Netzwerkmaterial völlig transparent ist. SSHFS ist für semi-permanente Setups gedacht, nicht nur für eine einmalige Dateiübertragung. Die Einrichtung ist etwas aufwendiger und kann auf der Projektwebsite nachgelesen werden .

Wenn Sie in einer Umgebung mit unterschiedlichen Betriebssystemen arbeiten müssen, ist Samba die nächstbeste Wahl. Windows und OS X unterstützen Samba vollständig automatisch und Linux auch, obwohl es manchmal schwierig zu bedienen ist.

jcrawfordor
quelle
3
Genau die Art von Antwort, die ich mir gewünscht hatte: vollständig, vollständig, detailliert und auf den Punkt gebracht.
Jonallard
2
Eine Sache aber, um scpzu funktionieren, müssen wir eine Art SSH-Server einrichten, Listener oder etwas auf der anderen Seite entsperren? Ich erhalte die Fehlermeldung "Verbindung abgelehnt".
Jonallard
2
scp verwendet ssh, es funktioniert also, wenn SSH funktioniert. Dies bedeutet natürlich, dass ein SSH-Server ausgeführt werden muss (Standardeinstellung in jeder mir bekannten Linux-Distribution) und eine Verbindung möglich sein muss (Firewalls, NAT usw. müssen die entsprechenden Ausnahmen aufweisen).
jcrawfordor
8
Anscheinend openssh-servermuss in Ubuntu Natty installiert werden.
Jonallard
3
Beachten Sie, dass sshdie Verschlüsselung verwendet wird, was zusätzlichen Aufwand verursacht. Wenn die beteiligten Computer über relativ langsame CPUs verfügen, kann dies einen Unterschied machen. In diesem Fall netcatoder in einem ähnlichen Fall (siehe Caspars Antwort) ist dies möglicherweise vorzuziehen. Natürlich nur, wenn Sie keine Verschlüsselung benötigen (in einem geschützten LAN).
sleske
59

Mein persönlicher Favorit für Fälle, in denen Sicherheit keine Rolle spielt, ist netcat + tar :

Um ein Verzeichnis zu senden, wechseln Sie in das Verzeichnis, dessen Inhalt Sie auf dem Computer senden möchten, und führen Sie folgende Schritte aus:

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

Wechseln Sie auf dem Computer, auf dem der Inhalt empfangen werden soll, zu der Stelle, an der der Inhalt angezeigt werden soll, und führen Sie folgende Schritte aus:

nc -w 10 $REMOTE_HOST 45454 | tar -xz

Ersetzen Sie $REMOTE_HOSTdurch IP / Hostname des Computers, der das Senden durchführt. Sie können stattdessen auch einen anderen Port verwenden 45454.

Was hier tatsächlich passiert, ist, dass der 'empfangende' Computer eine Verbindung zum sendenden Computer an Port 45454 herstellt und den tar- und gzip-Inhalt des Verzeichnisses empfängt und diesen direkt an tar (und gzip) weiterleitet, um ihn zu extrahieren das aktuelle Verzeichnis.

Kurzes Beispiel (localhost als Remote-Host verwenden)

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
Caspar
quelle
erinnert mich irgendwie an sendnet und recnet von Novels ipx-Diensten der alten Tage ...
sum1stolemyname
4
## netcat + bzip2 kann bei langsamen Verbindungen etwas schneller sein ## Server senden # cat file.txt | bzip2 -c | nc -l 1234 ## Empfangsserver # nc $ send_ip 1234 | bzip2 -cd> file.txt
shantanuo
@ Caspar: Wie wäre es mit der Bearbeitung dieser Antwort, um eine bzip2- oder lzma-Komprimierung vorzuschlagen?
Einpoklum
4
die -qOption zeigt an, dass Sie verwenden openbsd-netcat , während Gnu-netcat ist auch durchaus üblich (default in Arch Linux ). Könnten Sie Ihre Antwort um die Syntax von gnu-netcat erweitern ?
Sebastian
1
Der aktuelle nc man sagt über die Option -l: "Es ist ein Fehler, diese Option in Verbindung mit den Optionen -p, -s oder -z zu verwenden", aber seltsamerweise wird bei der Verwendung kein Fehler ausgegeben. Ich denke, die Verwendung von 'nc -l 45454' sollte genauso gut funktionieren.
Claudiu
19

Für einmalige Bewegungen wird scp empfohlen.

Wenn Sie jedoch feststellen, dass dieses Verzeichnis möglicherweise funktioniert und Sie es mehrmals verschieben müssen, um die andere Position auf dem neuesten Stand zu halten, können Sie rsync (mit ssh) verwenden.

Da rsync viele Argumente hat, füge ich es normalerweise in eine kleine Shell ein, damit ich es (jedes Mal) richtig mache. Die Idee ist, nur Dinge zu senden, die sich seit der letzten Ausführung geändert haben.

#!/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/

Dies verschiebt ein Verzeichnis mit dem Namen "/ home / media / music /" vom lokalen Computer auf den PC mit dem Namen 192.168.0.33 unter Verwendung des Benutzers "nisse". Und löschen Sie alles auf dem Ziel, was auf dem lokalen PC nicht vorhanden ist.

Johan
quelle
1
+ für rsync, was ein bisschen schneller zu sein scheint und sehr schön ist, wenn Sie das Verzeichnis später synchronisieren müssen
Wiesław Herr
Dies scheint sehr vielversprechend (und leicht wiederverwendbar) zu sein, aber ich habe Verzeichnisse und Dateien mit Leerzeichen und erhalte den Fehler rsync: Syntax- oder Verwendungsfehler (Code 1) bei main.c (1348) [sender = 3.1.1] - - irgendwelche Vorschläge?
Torben Gundtofte-Bruun
8

Ich würde Ihnen empfehlen, Alternativen zu versuchen, stattdessen SSH zu verwenden, um Dateien in Ihrem eigenen LAN zu verschieben, da der Overhead IMMENS ist. Ich würde mich für Caspars Lösung entscheiden, wenn diese aus irgendeinem Grund bei Ihnen nicht funktioniert:

An der Quelle:

$ python3 -m http.server {PICK_YOUR_PORT}

Am Bestimmungsort:

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

Dies ist nicht nur leichter als die Verwendung von SSH, sondern auch viel schneller mit Geschwindigkeiten von 45 bis 65 MB bei Standard-CAT6-UTP.
Wenn Sie wirklich das meiste aus der Verbindung herausholen möchten, versuchen Sie, wgetdurch lftpdie Befehle pget -n20und zu ersetzen mirror -r.

cig0
quelle
7

Der schnellste ist wahrscheinlich netcat(wie von caspar beschrieben).

Ich mag die Kombination von tar& ssh, die sicher und trotzdem schnell ist:

Auf der Quelle

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

Wenn Sie dies als root tun, bleiben die Dateiberechtigungen erhalten. Oder -pbeidseitig verwenden. Auch -Skönnte in Betracht gezogen werden, wenn Sie spärliche Dateien haben.

Es ist möglich, den Verschlüsselungsaufwand zu reduzieren, sshwenn Sie arcfourals Verschlüsselung verwenden, die mit openSSH funktioniert:

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

Das Aktualisieren des Remote-Pfads rsyncist perfekt:

rsync -av --sparse --delete -e "ssh -c arcfour" . root@targethost:/target/path
Tim Haegele
quelle
1
FWIW, ich habe kürzlich einen Übertragungstest zwischen zwei direkt verbundenen modernen Laptops mit rsync durchgeführt, sowohl mit der Option arcfour als auch ohne spezifisches Argument -e. Ich habe keinen Geschwindigkeitsunterschied bemerkt.
Randy Syring
4

Wenn es unbedingt über das LAN gemacht werden muss, würde ich verwenden rsync, da es dort weitermachen wird, wo es aufgehört hat, wenn es unterbrochen wird. Es gibt auch ein paar andere Tricks, um die zu übertragende Datenmenge zu minimieren, obwohl ich bezweifle, dass viele davon für den Fall relevant sind, dass eine Musikbibliothek an einen neuen Speicherort kopiert wird. Wenn Sicherheit ein Problem ist, setzen Sie es einfach RSYNC_RSH=sshzuerst und die Daten werden über ssh getunnelt.

Wenn ich es aber tatsächlich machen würde, würde ich das LAN wahrscheinlich überhaupt nicht nutzen. Ich würde die Dateien auf eine USB-Festplatte kopieren und dann wieder entfernen. Meiner Erfahrung nach kann dies trotz zweimaligem Kopieren der Dateien um ein Vielfaches schneller sein als das LAN. USB 2.0 ist für 480 Mbit / s ausgelegt, was schneller ist als alles andere als Gigabit-Ethernet und außerdem weniger anfällig für Bedingungen Dies beeinträchtigt die Leistung eines LAN. Es ist auch völlig unabhängig vom Betriebssystem, vorausgesetzt, Sie verwenden ein Dateisystem, das von allen beteiligten Computern unterstützt wird. Ich würde VFAT / FAT32 empfehlen, da dies so ziemlich universell ist.

Dave Sherohman
quelle
1
Ich bin auch ein Fan des (so genannten) Sneakernets, aber es ist erwähnenswert, dass USB 2 zwar 480 Mbit / s erreichen soll, aber bisher nur 30 Mbit / s (etwa 240 Mbit / s). Vielleicht habe ich nur billige USB <-> SATA-Hardware. Es lohnt sich darauf hinzuweisen, damit die Leute von der Fehlermeldung "out of space", die Windows (zumindest) ausgibt, nicht zu frustriert werden.
Caspar
@ Caspar: Gute Vorsichtsmaßnahmen! Danke, dass Sie sie erwähnt haben. Ich vergesse immer die Dateigrößenbeschränkung für FAT32 ...
Dave Sherohman
2

Ich würde rsync vorschlagen, da es Dateien inkrementell kopiert. Sie können festlegen, dass nur geänderte oder neue Dateien kopiert werden, nachdem Sie das erste Update durchgeführt haben. Wenn Sie möchten, können Sie ssh als Transportebene verwenden.

Sardathrion
quelle
1

Ich verwende Unison , ein großartiger Dateisynchronisierer für viele verschiedene Protokolle. Sie können es so konfigurieren , zu verwenden scp, rcp, ftpoder auch lokal auf dem Dateisystem zwischen zwei Ordnern. Ich verwende es, um meine Musikbibliothek zu synchronisieren, da es mehrere Dateien gleichzeitig über das Netzwerk übertragen kann und in seiner Konfiguration wirklich einstellbar ist. Ich halte meine Musiksammlung auf 2-3 Computern gesichert und synchron. Es werden nur geänderte Dateien kopiert. Hierzu wird an beiden Enden der Übertragung ein Index geführt, um feststellen zu können, wann ein Client die Datei geändert hat oder wann sich die Serverdatei geändert hat.

Ihre Laufleistung kann variieren, ist aber mit Sicherheit viel besser, als scpjedes Mal, wenn Sie einen neuen Song hinzufügen, Ihre gesamte Musiksammlung zu bearbeiten :)

Naftuli Kay
quelle
0

Ich habe zuerst den SSH-Prozess für die passwortlose Anmeldung befolgt. Http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/

Für Skripte und Textdateien funktioniert das Folgende für mich ganz gut

Übertragen von Daten vom lokalen Host zum Remote-Host. cat localfile | ssh <user>@<ip> "cat > <path>/<remotefile>"

Übertragen von Daten vom Remote-Host zum lokalen Host. ssh <user>@<ip> "cat > <path>/<remotefile>" | cat > localfile

Dies funktioniert für mich, um Dateien auf eingebetteten Systemen zu übertragen, auf denen kein ssh-Client oder scp integriert ist.

Kein scp - nur ssh.

enthusiasticgeek
quelle