Thomas Kramer

IT-COW | privates IT-Blog von (C) Thomas Kramer

rsync-Datentransfer über SSH tunneln

By Administrator at April 08, 2010 17:26
Filed Under: Administration, Anleitungen, Backup, Linux, Windows

rsync ist ein Kommandozeilen-Dateientransfer-Programm, ähnlich robocopy unter Windows. Es gehört zum Lieferumfang jeder Linux-Distribution. Rsync kann den Datentransfer optional über SSH tunneln, dazu muss ein SSH-Server sowie auch rsync selbst auf dem Server installiert sein.

 

Für Windows-Server gibt es da die Programme freeSSHd oder CopSSH, beide sind kostenlos erhältlich. Beide werden als Dienst installiert. Mit freeSSHd hatte ich bei mir das Problem, das ich immer nach dem Starten des Dienstes im Systray-Programm noch explizit einmal auf "SSH Server is not running. Click here to start it" klicken musste, also das Starten des Dienstes allein reichte nicht aus - auch nicht mit anderen Ports. Irgendwo las ich dann, das das ein Programmfehler sei. Die letzte Version hatte ich jedoch bereits drauf. Daraufhin hatte ich dann auf CopSSH umgesattelt.

 

CopSSH liefet einen Wizard mit, mit dem man die Windows-Benutzer des Servers für die SSH-Nutzung aktivieren oder deaktivieren kann. Per default ist die remote-Einloggung anschließend nur über eine Zertifikats-Datei möglich, nicht über das Passwort allein - es erscheint ansonsten (wenn die Zertifikats-Datei fehlt oder nicht angenommen wurde) zwar ein Login-Prompt, aber er nimmt dann das ansonsten korrekte Passwort nicht an. Desweiteren gibt es zu beachten, das CopSSH anders als freeSSHd eine eigene Shell mitbringt, die Linux-Shell Bash. Diese bedient sich etwas anders als die Windows-Eingabeaufforderung.

 

Auch mit Zertifikats-Datei muss zunächst der Windows-Benutzer angegeben werden, mit dem man sich einloggen möchte, da die Zertifikats-Datei ansich nicht mit den Benutzern verknüpft ist. Übrigens sollte man dabei aufpassen, wenn der Windows-Benutzer groß geschrieben wird muss er auch beim Einloggen über SSH großgeschrieben werden - es erscheint ansonsten keine Fehlermeldung! Man könnte sogar "xsdf" als Windows-Benutzer eingeben und es würde keine Fehlermeldung erscheinen.

 

Als Windows-Client kann man z. b. Putty benutzen. Zu Putty gehört puttygen.exe, mit diesem habe ich die Zertifikats-Datei erstellt. Dazu wählt man unten im Fenster die Art des Schlüssels aus und klickt dann anschließend im Menü auf "Key/Generate Key Pair". Anschließend kopiert man über die Zwischenablage den erzeugten Public Key in die Datei "authorized_keys" in das Home\$Benutzer$\.ssh - Verzeichnis jedes über CopSSH aktivierten Windows-Benutzers (im CopSSH-Programmverzeichnis). Den Private-Key erzeugt man über den Button "Save private key", und den muss man anschließend Putty zugänglich machen. Für Linux muss man übrigens beachten, der mit puttygen.exe erzeugte Private-Key ist nicht direkt OpenSSH kompatibel, lässt sich also nicht direkt unter Linux verwenden. Für einen Linux-kompatiblen Private-Key muss man anschließend im Menü von puttygen auf "Conversions/Export OpenSSH Key" klicken.

 

Rsync braucht ebenfalls diesen OpenSSH-kompatiblen Schlüssel, wenn der Datentransfer darüber laufen soll. Bei mir sieht der rsync-Befehl übrigens so aus:

 

rsync -atvu --include-from=/home/$Linux-Benutzer$/incFile.txt --exclude=*.* -e '/usr/bin/ssh -i /home/$Linux-Benutzer$/openssh.key' /Quellverzeichnis/ $Windows-Benutzer$@IP_des_Servers:/cygdrive/$Laufwerksbuchstabe$/$Verzeichnis$

 

Der Befehl bedeutet "kopiere alle Dateien der Dateitypen, die in der Datei incFile.txt stehen - und zwar NUR diese! - über SSH auf das über $Laufwerksbuchstabe$/$Verzeichnis$ angegebene Verzeichnis des Servers". Exclude *.* schließt zunächst alles aus, aber mit der incFile.txt werden dann die Ausnahmen gemacht. Damit er das rekursiv, also inkl. Unterverzeichnisse macht, muss die Option -r angegeben werden (-a beinhaltet aber auch -r). Übrigens, die Datei incFile.txt muss abschließend am Ende einmal */ stehen haben, ansonsten werden trotz Rekursiv-Option die Unterverzeichnisse nicht beachtet. Exclude *.* scheint eben auch die Unterverzeichnisse auszuschließen, obwohl ein .* darin enthalten ist. Update 16.05.2010: aufpassen das nach */ kein Leerzeichen folgt, ansonsten funktioniert es nicht.

 

Zu beachten ist, das anders als freeSSHd CopSSH eine Linux-Bash als Remote-Login anbietet. Die Benutzung ist damit etwas anders, Laufwerksbuchstaben wie unter Windows gibt es da nicht. Wenn man sich über SSH oder Putty einloggt und anschließend ins Stammverzeichnis über CD / zurückgeht, findet man die Windows-Laufwerke über das Unterverzeichnis cygdrive. Also unter /cygdrive/c/ ist dann das C-Laufwerk zu finden. Dir geht übrigens nicht, stattdessen ist der Befehl ls -l zu verwenden.

 

Damit der Datentransfer von rsync über SSH funktioniert, muss rsync auch auf dem Server installiert sein. Das kann man wie CopSSH hier herunterladen. Die rsync.exe sollte anschließend in das /bin/-Verzeichnis von CopSSH kopiert werden. Außerdem sollte nicht vergessen werden, den Port für SSH (22) sowohl auf dem Server als auch dem Client zu öffnen in der Firewall.

 

Weitere Links zu dem Thema: 1 2 3 4 5 6

 

Ergänzung 28.04.2010: Hier habe ich davon gelesen das man auch Bildschirmausgaben von grafischen Programmen über SSH auf den eigenen Rechner umlenken kann. Update 22.02.2011: Habe ich mittlerweile getestet, siehe Link.

 

Update 19.07.2010: Nach meinen Erfahrungen ist robocopy unter Windows fehlertoleranter als rsync unter Linux, der entsprechende Befehl von oben (ohne SSH) sieht dort folgendermaßen aus:  

 

robocopy \\$IP$\$Freigabe$\ $Lfwk$:\$Verzeichnis$ /IF *.end1 *.end2 /W:10 /Z

 

Monats-Liste