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:
#!/bin/sh
rsync user@server1:/path/to/stuff /path/to/loca/copy -a --delete --compress
rsync /path/to/loca/copy user@server2:/path/to/where/stuff/should/go -a --delete --compress
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 eine Kopie von / bin / sh als / usr / local / bin / shforkeepalive. Verwenden Sie einen symbolischen Link anstelle einer Kopie, dann müssen Sie ihn nach Sicherheitsupdates, die patch / bin / sh sind, nicht aktualisieren.
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:
#!/usr/local/bin/shforkeepalive
while [ "1" != "0" ]; do
echo Beep!
sleep 5
done
( 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):
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 /usr/local/bin/keepalivesctipt &
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
ssh user@server2 killall shforkeepalive
So funktioniert das:
- Zeile 1: Standardmarkierung "Befehl zum Interpretieren dieses Skripts"
- Zeile 2: Starten Sie eine SSH-Verbindung mit Reverse Tunnel und führen Sie das Keepalive-Skript darüber aus, um es offen zu halten. Das nachfolgende & weist bash an, dies im Hintergrund auszuführen, damit die nächsten Zeilen ausgeführt werden können, ohne darauf zu warten, dass sie beendet werden
- Zeile 3: Starten Sie einen Tunnel, der eine Verbindung zum obigen Tunnel herstellt, damit Server1 Server2 sehen kann, und führen Sie rsync aus, um das Kopieren / Aktualisieren über diese Anordnung durchzuführen
- Zeile 4: Beenden Sie das Keep-Alive-Skript, sobald der rsync-Vorgang abgeschlossen ist (und der zweite SSH-Aufruf zurückkehrt), und die erste ssh-Sitzung.
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:
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 sleep 60 &
pid=$!
trap "kill $pid" EXIT
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
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:
#!/bin/sh
ssh user@server1 -R2222:123.123.123:22 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
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.