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

Die Schritte

  1. 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

  2. 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.

  3. 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

  4. 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 --version

    Die Ausgabe ist zu interpretieren wie oben. Anschließend kann man den Server wieder verlassen:
    syncer@files.hoster.de:~$ exit

  5. 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.

  6. 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:~$ exit

    Fehlerquelle:
    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.

  7. Passwort-freien Login testen:

    egon@daheim:~$ ssh -i .ssh/syncer.identity files.hoster.de
    syncer@files.hoster.de:~$ exit

    Auch 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).

  8. 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ß!

© Hermann Faß, 2006-2012