Rsync über SSH
Anleitung zum sicheren, ressourcenschonenden Synchronisieren von Daten
Vorbemerkungen
Wir gehen, nur als Beispiel, davon aus, dass Benutzer egon seine Daten vom Rechner daheim auf einen Server files.hoster.de synchronisieren will. Der Vorgang ist exakt derselbe, wenn wir einen Server auf einen anderen Server spiegeln.
Voraussetzungen
-
Der Benutzer hat Root-Zugriff auf beide Systeme. Es wird hier übrigens angenommen, dass mit allen Benutzer-IDs die BASH-Shell verwendet wird.
-
Rsync auf beiden Systemen verfügbar.
Auf einem Windows-PC kann das mittels Cygwin verfügbar gemacht werden. -
SSH ist auf beiden Systemen verfügbar. Cygwin bietet auch dieses.
-
TCP-Verbindungen auf Port 22 des entfernten Systems sind möglich.
Die Schritte
-
Benutzer syncer auf dem System files.hoster.de anlegen. Der Benutzer braucht eine echte Shell und ein Passwort.
root@files.hoster.de:~# useradd -s /bin/bash -m -d /home/syncer syncer
root@files.hoster.de:~# passwd syncer
Enter new UNIX password: *******
Retype new UNIX password: *******
passwd: password updated successfully -
Testen, ob der Login funktioniert:
egon@daheim:~$ ssh -l syncer files.hoster.de
syncer@files.hoster.de's password: *******
syncer@files.hoster.de:~$ exit
egon@daheim:~$Nach Eingabe des Passwortes muss man validieren, dass man jetzt auch wirklich als Benutzer syncer auf dem Server files.hoster.de eingeloggt ist. Das erkennt man daran, dass es keine Fehlermeldung gibt und dass die Eingabeaufforderung dann z.B. syncer@files.hoster.de o.ä. ist. Ansonsten muss man Fehlermeldung genau lesen und den Fehler beheben. Das sind Unix-Grundlagen, die hier nicht erklärt werden.
-
Testen, ob Rsync lokal installiert ist:
egon@daheim:~$ rsync --version
Liefert das eine Fehlermeldung wie
rsync: command not found, dann muss man es installieren. Bei Cygwin startet man das Installationsprogramm neu und installiert Rsync nach. Bei Linux richtet sich die Vorgehensweise nach Distribution und Paket-Manager. Für Ubuntus Advanced Packaging Tool geht das mit:
apt-get install rsync -
Testen, ob Rsync auf dem entfernten Server installiert ist:
egon@daheim:~$ ssh -l syncer files.hoster.de
syncer@files.hoster.de's password: *******
syncer@files.hoster.de:~$ rsync --versionDie Ausgabe ist zu interpretieren wie oben. Anschließend kann man den Server wieder verlassen:
syncer@files.hoster.de:~$ exit -
Passwortfreies Schlüsselpaar erstellen (bei Passwort-Abfrage kein Passwort eingeben, sondern nur mit Return quittieren):
egon@daheim:~$ cd .ssh
egon@daheim:.ssh$ ssh-keygen -t rsa -f syncer.identity
Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in syncer.identity. Your public key has been saved in syncer.identity.pub. -
Schlüssel von daheim auf files.hoster.de autorisieren, d.h. die Datei mit dem Public-Key auf files.hoster.de übertragen und dort ihren Inhalt an die Datei ~/.ssh/authorized_keys anhängen:
egon@daheim:~$ scp syncer.identity.pub syncer@files.hoster.de:~
egon@daheim:~$ ssh -l syncer files.hoster.de (Passwort eingeben)
syncer@files.hoster.de:~$ ! [ -e .ssh ] && mkdir .ssh
syncer@files.hoster.de:~$ chmod 700 .ssh
syncer@files.hoster.de:~$ cat syncer.identity.pub >> .ssh/authorized_keys
syncer@files.hoster.de:~$ chmod 600 .ssh/authorized_keys
syncer@files.hoster.de:~$ exitFehlerquelle:
Bei älterer SSH2-Implementierung kann es sein, dass die Datei mit autorisierten Schlüsseln statt authorized_keys noch authorized_keys2 heißen muss. In dem Fall ist alles wie oben durchführen, aber eben den Dateinamen entsprechend zu ändern. -
Passwort-freien Login testen:
egon@daheim:~$ ssh -i .ssh/syncer.identity files.hoster.de
syncer@files.hoster.de:~$ exitAuch hier muss man wirklich ohne Passworteingabe (!) zum Benutzer syncer auf dem Rechner files.hoster.de werden. Sonst muss man wieder weiter oben beginnen. Die Berechtigungen für das Verzeichnis .ssh und dessen Inhalt sind übrigens kritisch (
700
bzw.600
). -
Manuellen Aufruf von Rsync testen. Wir nehmen dazu an:
- Die lokalen Daten, z.B. egons Website, liegen im Verzeichnis /home/egon/var/www/, also relativ ~/var/www/.
-
Die Kopie liegt auf dem entfernten Server unter
/var/www/htdocs/. Man bedenke, dass der Benutzer
syncer auf diesem Verzeichnis Schreibrechte braucht, die er
z.B. über eine Gruppenzugehörigkeit bekommen kann oder aber er wird
komplett zum Eigentümer dieser Dateien:
syncer@files.hoster.de:~$ sudo chown -R syncer /var/www/htdocs
Wenn man folgenden Aufruf in einer Zeile angibt (z.B. später in der Crontab) dann sind die Backslash-Zeichen wegzulassen:
egon@daheim:~$ rsync -e 'ssh -i .ssh/syncer.identity' \ -avz --delete ~/var/www/ \ files.hoster.de:/var/www/htdocs/
Achtung: Die Option
--delete
sorgt dafür, dass Dateien, die zwar im Zielverzeichnis liegen, aber auf dem lokalen System gelöscht wurden, auch auf dem Server gelöscht werden.Für alle weiteren Optionen steht man rsync Rede und Antwort.
Weitere Schritte
Wenn der Aufruf tut, was er soll, wird man den Daten-Abgleich automatisieren wollen. Für ein Backup eignen sich Cronjobs, die, z.B. nächtlich, alle Daten aktualisieren.
Für sonstige Aufgaben kann man sich kleine Skripte mit dem jeweiligen Aufruf machen und diese per Mausklick aufrufbar machen.
Viel Spaß!