Ich möchte Dateien zwischen zwei Remote-Hosts über die lokale Shell übertragen, aber es scheint, dass rsync die Synchronisierung nicht unterstützt, wenn zwei Remotes wie folgt angegeben sind:
$ rsync -vuar host1:/var/www host2:/var/www
The source and destination cannot both be remote.
Welche anderen Problemumgehungen / Befehle könnte ich verwenden, um ähnliche Ergebnisse zu erzielen?
sshfs
ist, dass dannrsync
das Quell- und das Zieldateisystem als lokal angesehen werden und der Delta-Algorithmus deaktiviert wird. An diesem Punkt können Sie fast genauso gut einfach verwendencp -p
. Siehe die Antwort, die dies und die nachfolgenden Kommentare vorschlägt .Antworten:
Wie Sie festgestellt haben, können Sie rsync nicht mit einer Remote-Quelle und einem Remote-Ziel verwenden. Angenommen, die beiden Server können nicht direkt miteinander kommunizieren, ist es möglich, mit ssh über Ihren lokalen Computer zu tunneln.
Anstatt von
Sie können dies verwenden
Falls Sie sich fragen,
-R
richtet die Option einen Rückkanal von Port 50000 auf Host1 ein, der (über Ihren lokalen Computer) Port 22 auf Host2 zuordnet. Es gibt keine direkte Verbindung von Host1 zu Host2.quelle
sshfs
beide Remote-Verzeichnisse lokal gemountet und dannrsync
über die beiden lokal gemounteten Verzeichnisse hinweg verwendet.-i
der für die ssh-Befehle erforderlichen Schlüssel.-i key...
Parameter in die Anführungszeichen nach demssh
Befehl ein. Wenn Ihnen das nicht hilft, können Siescp -3
.Sie haben nicht gesagt, warum Sie sich nicht bei einem Host anmelden und dann auf den anderen kopieren möchten, sodass ich einen meiner Gründe und Lösungen erläutere.
Ich konnte mich nicht bei einem Rechner anmelden und dann mit dem anderen synchronisieren, da keiner der Hosts einen SSH-Schlüssel hatte, der sich bei dem anderen anmelden konnte. Ich habe dieses Problem gelöst, indem ich die SSH-Agentenweiterleitung verwendet habe, damit der erste Host meinen SSH-Schlüssel verwenden kann, während ich angemeldet war.
WARNUNG: Durch die SSH-Weiterleitung kann der Host Ihren SSH-Schlüssel für die Dauer Ihrer Anmeldung verwenden. Obwohl sie Ihren Schlüssel nicht kopieren können, können sie sich damit auf anderen Rechnern anmelden. Stellen Sie sicher, dass Sie die Risiken verstehen, und verwenden Sie die Agentenweiterleitung nicht für Computer, denen Sie nicht vertrauen.
Der folgende Befehl verwendet die SSH-Agentenweiterleitung, um eine direkte Verbindung von
host1
zu herzustellenhost2
. Dies hat den Vorteil, dass der Computer, auf dem der Befehl ausgeführt wird, die Übertragung nicht beeinträchtigt.quelle
-D
anstatt das-A
Netzwerk zu umgehen, und nicht die wichtigsten Einschränkungen); zur Erläuterung des Vorteils; weil der Befehl kurz ist; und es funktioniert tatsächlich. Beachten Sie, dass Sie möglicherweise angeben müssen,username@host1
ob es sich um einen anderen als den lokalen Benutzernamen handelt. Außerdem führt rsync eine Überprüfung des Hostschlüssels durch, wenn eine Verbindung zu Host2 hergestellt wird. Daher sollte sich der Schlüssel von Host1 bereits in ~ / .ssh / known_hosts auf Host2 befinden, da sonst der Befehl fehlschlägt.ssh -A
können. Siehe Zusammenfluss. jetbrains.com/display/TCD10/SSH+Agent ).Ich mag die Antwort von Roaima, aber die Wege sind in beiden Beispielen die gleichen und verdecken, welcher welcher ist. Wir haben festgestellt, dass Folgendes nicht funktioniert:
Dies ist jedoch der Fall (ich habe die explizite bind_address von localhost in der
-R
Option weggelassen, da dies die Standardeinstellung ist):Beachten Sie, dass ssh-Schlüssel zwischen den beiden Remote-Hosts korrekt eingerichtet sein müssen, wobei der private Schlüssel auf Host1 und der öffentliche Schlüssel auf Host2 vorhanden sein müssen.
Um die Verbindung zu debuggen, teilen Sie dies in zwei Teile und fügen Sie den ausführlichen Status hinzu:
Wenn dies funktioniert, haben Sie eine Shell auf Host1. Probieren Sie jetzt den Befehl rsync von host1 aus. Ich empfehle, dies in einem anderen Fenster zu tun, damit die ausführlichen ssh-Informationen nicht mit den rsync-Statusinformationen gemischt werden:
quelle
rsync
wird auf Host1 mit dem Ziel auf Host2 initiiert. (Sie hätten in einem Kommentar um Klarstellung bitten können.)Neuformatierung der Antwort von Roaima in der Bash-Skript-Syntax (und Hinzufügen von Zeilenfortsetzungszeichen '\' zur Klarheit) Ich habe zufällig Port 22000 ausgewählt ...
quelle
Der ideale Weg wäre, den
rsync
auf einem dieser Server auszuführen . Aber wenn Sie kein Skript auf dem Remote-Server ausführen möchten. Sie könnten ein Skript auf Ihrem lokalen System ausführen und ein ssh ausführen und dort den rsync ausführen.ssh user@$host1 <<ENDSSH >> /tmp/rsync.out 2>&1 rsync -vuar /var/www host2:/var/www ENDSSH
Wie Sie vielleicht wissen, führt rysnc auch eine einseitige Synchronisation durch. Wenn Sie eine bidirektionale Synchronisierung wünschen, können Sie sich osync ( https://github.com/deajan/osync ) ansehen . Ich benutze es und fand es hilfreich.
quelle
Nur als zusätzliche Info:
Wenn Sie einen Sprunghost verwenden, um die beiden anderen Maschinen zu verbinden, diese sich jedoch nicht direkt erreichen können, können Sie sshfs wie folgt als Medium zwischen diesen beiden Maschinen verwenden (auf dem Sprunghost):
SSHFS stellt die beiden Pfade auf dem Sprunghost bereit und rsync verwaltet die Synchronisierung der Dateien wie immer (nur mit dem Unterschied, dass dies praktisch lokal erfolgt).
quelle
Sie könnten einen rsyncd (Server) auf einem der Computer ausführen.
Dies ist der Ansatz, den ich verfolge, da ich ssh nicht verwenden möchte, um der Quelle (in Rsync-Form) den Zugriff auf das Ziel als root ohne Passwort zu ermöglichen (wie es erforderlich ist, um SSH-Tunneling mit Rsync in zu verwenden) ein Skript)
In meinem Fall habe ich einfach einen rsyncd-Server auf dem Zielcomputer eingerichtet, wobei nur ein Benutzer vom Quell-PC aus berechtigt war und rsync von der Quellseite aus verwendet wurde.
Funktioniert super.
quelle
Versuchen Sie dies. Für mich geht das.
quelle
Ein einfach zu verwendendes Skript
Im Laufe der Jahre habe ich dies viele Male mit mehr oder weniger den gleichen Tricks wie bei jeder anderen Antwort hier getan. Da es jedoch sehr einfach ist, einige Details falsch zu machen und viel Zeit damit zu verbringen, das Problem herauszufinden, habe ich mir das folgende Skript ausgedacht:
ssh -A
Authentifizierungsdaten nicht weitergegeben werden können (ich weiß nicht, warum dies manchmal passiert, da die Problemumgehung einfacher war als die Ermittlung der Hauptursache).Verwendung des Skripts
Wie es funktioniert
Wie gesagt, es werden die gleichen Tricks angewendet wie bei jeder anderen Antwort hier:
-R
Option von ssh, von localhost zu host1 zu ssh, während gleichzeitig eine Portweiterleitung eingerichtet wird, die es host1 ermöglicht, eine Verbindung über localhost zu host2 (-R localhost:$FREE_PORT:$TARGET_ADDR_PORT
) herzustellen.-A
Option von ssh, um eine einfache Authentifizierung des zweiten ssh-Kanals zu ermöglichenMein das IST kompliziert! Gibt es einen einfacheren Weg?
Wenn Sie alle oder die meisten Bytes von der Quelle zum Ziel kopieren , ist die Verwendung um ein Vielfaches einfacher
tar
:Das Drehbuch
quelle
tar
ist großartig, wenn Sie eine einzelne (nicht inkrementelle) Übertragung haben und Ihre Übertragung in einem einzigen Durchgang abgeschlossen ist. Auf der anderen Seite werdenrsync
mit Weiterleitungsgriffen Neustarts und inkrementelle Übertragungen durchgeführt.Es ist möglich,
tar
viassh
zu verwenden, um die Dateien zu übertragen:Ändern Sie den
j
Parameter (fürtar
) anz
zwei Stellen auf, wenn Sie das Archiv mitgzip
anstelle von komprimieren möchtenbzip2
. Normalerweisebzip2
ist die Komprimierung höher alsgzip
, aber langsamer. Ändern Sie sie entsprechend Ihren Anforderungen (siehe: bzip2 vs gzip ).Verwandte Themen: Wie kopiert man zwischen zwei Remote-Hosts mithilfe von tar, das von einem Remote-Server hinter einer Firewall in SSH geleitet wird?
Alternativ (um die Bandbreite zu schonen, wegen der transparenten Komprimierung) ist es möglich, das
sshfs
entfernte Dateisystem als lokal einzubinden undrsync
wie gewohnt zu verwenden, zquelle