Warum SSH?
SSH bietet mehr Möglichkeiten beim Zugriff auf andere Server, das erleichtert uns das Leben beim Dateitransfer!
Bei großen Dateien wie Videos oder Bilder dauert es lange, die ganzen Daten zuerst per FTP auf den eigenen Rechner herunterzuladen und dann auf den Zielserver wieder hochzuladen. Stattdessen wollen wir die Daten direkt von einem Server auf den anderen kopieren. Ohne dem Zwischenschritt über unseren lokalen Rechner.
Um diese Reise der Daten so einfach und sicher wie möglich zu machen, benötigen wir Zugriff auf unseren Server über SSH.
Variante 1: SSH-Zugang auf beiden Servern, zumindest einer mit Passwort
Wenn wir uns bei zumindest einem Server mit Passwort (und nicht mit SSH-Key/Schlüsseldatei) anmelden können, geht’s recht einfach.
Nehmen wir an, der Quellserver verlangt ein Passwort, wir wollen den wp-content-Ordner kopieren, der dort unter /var/www liegt. Wir wollen ihn auf dem neuen Server unter /var/www/htdocs ablegen. Unser Benutzer auf dem Quellserver lautet user und das Passwort wird nach dem Ausführen des Befehls abgefragt.
Zuerst müssen wir eine SSH-Verbindung zum Zielserver aufbauen. Dafür brauchen wir den Benutzernamen des Accounts und dessen URL oder IP.
## Wir verbinden uns zum Zielserver
$ ssh adminuser@zielserver.at
Sobald wir am Zielserver angemeldet sind, können wir die Daten kopieren.
## Versuchen wirs mal mit rsync
$ rsync -atzP user@quellserver.at:/var/www/wp-content /var/www/htdocs
Wir versuchen es erst mal mit rsync. Falls das auf beiden Servern verfügbar ist, ist rsync sicher die beste Variante.
Rsync überträgt nur die Dateien, die sich unterscheiden. Damit kann abgebrochene Kopiervorgänge mit dem gleichen Befehl fortsetzen und schon einmal übertragene Ordner später synchronisieren. Eine Erklärung des verwendeten rsync-Kommandos gibt es auch, leider nur auf Englisch.
Hinweis: Es macht einen Unterschied ob wir bei der Angabe der Quelle mit einem / aufhören oder nicht.
## Das hier kopiert das Verzeichnis wp-content selbst nach htdocs
user@quelle:/var/www/wp-content /var/www/htdocs
## Das hier kopiert den Inhalt von wp-content nach htdocs
user@quelle:/var/www/wp-content/ /var/www/htdocs
Sollte das fehlschlagen, weil rsync nicht vorhanden ist, können wir noch immer auf scp zurückgreifen.
## Wir sind noch mit dem Zielserver verbunden
$ scp -rp user@quellserver.at:/var/www/wp-content /var/www/htdocs
Das scp-Kommando erklärt.
Wenn man sich nur beim Zielserver mit Passwort anmelden kann, dann verbindet man sich zuerst zum Quellserver und vertauscht dann bei den beiden Befehlen die Pfade, also zB:
$ ssh user@quellserver.at
$ rsync -atzP /var/www adminuser@zielserver.at:/var/www/htdocs/wp-content
Variante 2: SSH-Zugang auf beiden Servern, ohne Passwörter (mit Schlüsseldateien)
In diesem Fall müssen wir zuerst sicherstellen, dass der eine Server dem anderen vertraut.
Denn Schlüsseldateien können wir nicht wie Passwörter auf der Kommandozeile eingeben. Ich nehme den Zielserver für meine Aktionen, es geht natürlich auch anders herum.
Zuerst prüfen wir, ob es am Server schon einen SSH-Schlüssel gibt:
lokal$ ssh adminuser@zielserver.at
ziel$ ls ~/.ssh
authorized_keys id_rsa id_rsa.pub known_hosts
Wenn hier keine Datei mit einer .pub-Endung auftaucht, dann müssen wir erst ein SSH-Schlüsselpaar generieren. Dafür gibt es in der git Doku eine schöne Anleitung, es ist aber nur ein Befehl:
ziel$ ssh-keygen
Jetzt können wir den öffentlichen Schlüssel ausgeben:
ziel$ cat ~/.ssh/id_rsa.pub
Diesen öffentlichen Schlüssel (das ist nur eine lange Zeile, die mit ssh-rsa beginnt und mit user@ziel endet) kopieren wir jetzt aus der Kommandozeile.
Wir müssen diesen Schlüssel am anderen Server als vertrauenswürdig hinterlegen. Dazu hängen wir ihn am Quellserver an die Datei ~/.ssh/authorized_keys an. Das geht auch über SSH mit einem Texteditor wie nano oder vim.
Damit ist eine direkte Verbindung vom Ziel- zum Quellserver möglich, was wir auch testen können:
lokal$ ssh ziel
ziel$ ssh user@quellserver.at
quelle$ exit
Jetzt wo die beiden Server miteinander sprechen können, können wir einfach bei Variante 1 fortfahren und rsync oder scp für den Dateitransfers nutzen.
Kontrolle
Mit rsync lässt sich sehr einfach kontrollieren, ob alles korrekt kopiert wurde.
Man kann den selben Befehl einfach nochmal ausführen. Rsync stellt fest dass beide Verzeichnisse ident sind und es werden keine Daten mehr kopiert.
Wenn wir ohne rsync auskommen wollen, gehts nur, indem wir bei beiden Servern alle Dateien auflisten und beide Listen vergleichen. Unterschiedlichen Inhalte können wir damit aber nicht feststellen (die Dateigrößen aber schon).
$ ssh user@quellserver.at 'find /var/www -printf "%p\t%s\n"' > q.txt
$ ssh adminuser@zielserver.at 'find /var/www/htdocs -printf "%p\t%s\n"' > z.txt
$ diff q.txt z.txt # Vergleich der beiden Listen
$ rm q.txt z.txt # Aufräumen
(Idee für die formatierte Ausgabe von Dateiname und -größe kommt von Dennis Williamson).
Links
- https://de.wikipedia.org/wiki/Rsync
- https://explainshell.com/explain?cmd=rsync+-atzP+user%40quelle%3A%2Fvar%2Fwww%2Fwp-content+%2Fvar%2Fwww%2Fhtdocs
- https://explainshell.com/explain?cmd=scp+-rp+user%40quelle%3A%2Fvar%2Fwww%2Fwp-content+%2Fvar%2Fwww%2Fhtdocs
- https://git-scm.com/book/de/v2/Git-auf-dem-Server-Erstellung-eines-SSH-Public-Keys
- https://serverfault.com/questions/69469/how-to-compare-two-directories-residing-in-two-different-servers/69480#69480