Hier ist die Verbindung:
[Server1] <---> [my desktop] <---> [Server2]
Server1 und Server2 dürfen nicht direkt miteinander sprechen (nicht fragen). Mein Desktop kann jedoch über ssh auf beide Server zugreifen.
Ich muss Dateien von Server1 nach Server2 kopieren.
Traditionell habe ich einen ssh + tar-Hack als solchen verwendet:
ssh -q root@Server1 'tar -vzc /path/to/files ' | ssh -q root@Server2 'tar -vzx -C /'
Und das funktioniert großartig, aber ich möchte noch einen Schritt weiter gehen und rsync zwischen den beiden Servern über meinen Desktop zum Laufen bringen.
Jetzt weiß ich, dass ich in einem Terminal einen SSH-Port-Forward-Tunnel starten und dann in einem anderen Fenster über diesen Tunnel synchronisieren kann, aber ich möchte nicht mit einem zweiten Terminal herumspielen oder einen separaten Port-Forward-Tunnel erstellen und brechen. was ich will ist:
- Ein Liner-Befehl zum Synchronisieren von Dateien von Server1 auf Server2 über meinen Desktop
- Alles in EINER Befehlszeile, einem Terminalfenster
- Ich möchte, dass der Port-Forward-Tunnel nur für die Lebensdauer des Befehls rsync vorhanden ist.
- Ich möchte nicht scp, ich möchte rsync.
Hat jemand einen Trick dafür?
EDIT: Hier ist der Arbeitsbefehl! Tolle Arbeit an alle: 1. Für den rsa-Schlüsselpfad kann ich keine Tildae verwenden, musste "/ root /" verwenden. 2. Hier ist die letzte Befehlszeile:
ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
Boom macht das Dynamit.
Antworten:
Wenn Sie gerne eine Kopie der Daten auf dem Zwischencomputer behalten möchten, können Sie einfach ein Skript schreiben, das die lokale Kopie mit Server1 als Referenz aktualisiert und dann die Sicherung auf Server2 mit der lokalen Kopie als Referenz aktualisiert hat:
Die Verwendung eines einfachen Skripts bedeutet, dass Sie einen einzelnen Befehl für alles gewünscht haben. Dies kann natürlich ein Sicherheits-Nein-Nein sein, wenn die Daten vertraulich sind (Sie oder andere in Ihrem Unternehmen möchten möglicherweise keine Kopie auf Ihrem Laptop). Wenn server1 für Sie lokal ist, können Sie die lokale Kopie anschließend einfach löschen (da sie beim nächsten Mal schnell über das lokale LAN wiederhergestellt werden kann).
Der Bau eines Tunnels, damit die Server effektiver und direkter miteinander kommunizieren können, sollte folgendermaßen möglich sein:
Erstellen Sie auf Server 2 ein Skript, das nur ein paar Sekunden lang in einer Schleife schläft und dann eine kleine Textmenge wiedergibt. Verwenden Sie dazu die jetzt "Kopie" von sh:
(
echo
Dies wird wahrscheinlich nicht benötigt, da die Sitzung nicht lange genug inaktiv sein wird, um eine Zeitüberschreitung zu verursachen, selbst wenn SSHd so konfiguriert ist, dass Keep-Alive-Pakete vom SSH-Client ignoriert werden.)Jetzt können Sie ein Skript auf Ihren Laptop schreiben, das Ihren Reverse-Tunnel im Hintergrund startet, Server1 anweist, rsync zum Ausführen des Kopiervorgangs zu verwenden, und dann den Reverse-Tunnel beenden, indem Sie das Schleifenskript beenden (wodurch die SSH-Sitzung geschlossen wird):
So funktioniert das:
Das fühlt sich nicht besonders sauber an, sollte aber funktionieren. Ich habe das oben genannte nicht getestet, daher müssen Sie es möglicherweise optimieren. Wenn Sie den Befehl rsync auf Server1 zu einem einzeiligen Skript machen, können Sie möglicherweise weniger Zeichen wie den Befehl 'auf dem aufrufenden ssh-Befehl maskieren.
Übrigens: Sie sagen "fragen Sie nicht", warum sich die beiden Server nicht direkt sehen können, aber es gibt oft gute Gründe dafür. Mein Heimserver und der Server, auf dem seine Online-Backups gespeichert sind, können sich nicht gegenseitig anmelden (und haben unterschiedliche Kennwörter + Schlüssel für alle Benutzer). Dies bedeutet, dass einer der beiden Server, wenn er gehackt wird, nicht als einfacher Weg zu verwendet werden kann Hacken Sie den anderen, damit meine Online-Backups sicherer sind (jemand, der böswillig meine Daten aus dem Live-Modus löscht, kann seine Fähigkeit zum Aktualisieren der Backups nicht nutzen, um diese Backups zu löschen, da er die direkte Backup-Site nicht direkt berühren kann). Beide Server können an anderer Stelle eine Verbindung zu einem Zwischenserver herstellen. Der Live-Server ist so eingestellt, dass er seine Backups (über rsync) am frühen Morgen auf den Zwischencomputer überträgt, und der Sicherungsserver wird eingestellt (eine Weile später, damit Schritt 1 abgeschlossen werden kann), um eine Verbindung herzustellen und sammeln Sie die Updates (erneut über rsyc, gefolgt von einem Snapshot-Schritt, um mehrere Sicherungsalter aufrechtzuerhalten). Diese Technik kann auch unter Ihren Umständen verwendet werden, und wenn ja, würde ich sie als viel sauberere Art und Weise empfehlen, Dinge zu tun.
Bearbeiten: Wenn ich meinen Hack mit dem von Aaron zusammenführe, um zu vermeiden, dass mit Kopien von / bin / sh und einem separaten Keep-Alive-Skript auf Server2 herumgespielt wird, sollte dieses Skript auf Ihrem Laptop den gesamten Job erledigen:
Wie oben beschrieben stellt rsync eine Verbindung zu localhost: 2222 her, das den Tunnel zum localhost: 2222 Ihres Laptops weiterleitet und über den anderen Tunnel zum localhost: 22 von server2 weiterleitet.
Bearbeiten 2: Wenn es Ihnen nichts ausmacht, dass Server1 über einen Schlüssel verfügt, mit dem er sich direkt bei Server2 authentifizieren kann (obwohl Server2 ohne Tunnel nicht angezeigt werden kann), können Sie dies weiter vereinfachen:
Dabei ist 123.123.123.123 eine öffentliche Adresse für Server2, die anstelle eines Skripts als Einzeiler zum Kopieren und Einfügen verwendet werden kann.
quelle
ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
If you don't mind server1 having a key ...
. Können Sie mir bitte sagen, ob es wirklich möglich ist, den Schlüssel von Server2 auf Server1 zu vermeiden?Hier sind einige Methoden, die die Synchronisation zu einem einfachen Einzeiler machen, jedoch einige Einrichtungsarbeiten erfordern.
Richten Sie einen umgekehrten SSH-Tunnel von Server1 zu Ihrem Desktop ein (Entschuldigung, ich kann Ihnen die
.ssh/config
Beschwörung nicht sagen ). Verketten Sie es mit einer Verbindung von Ihrem Desktop zu Server2. Führen Sie rsync von Server1 aus.Richten Sie auf Ihrem Desktop einen Socken-Proxy (oder einen http-Proxy, der CONNECT akzeptiert) ein. Verwenden Sie diese Option, um eine SSH-Verbindung von Server1 zu Server2 herzustellen. Führen Sie rsync von Server2 aus.
Verwenden Sie unisono anstelle von rsync. Der Workflow ist jedoch anders.
Hängen Sie die Verzeichnisse mit sshfs von einem oder beiden Servern auf Ihrem Desktop ein .
quelle
Warum eine Zeile? Verwenden Sie ein kleines Shell-Skript:
IIRC können Sie die Schlafzeit niedriger einstellen; Der erste
ssh
wird nicht beendet, solange jemand den Kanal verwendet.quelle
sleep
undtrap
ordentlicher sind als diese .