SVN+SSH unter Windows nutzen

Vor einiger Zeit habe ich hier im Blog beschrieben, wie man einen SVN-Server mit SSH-Zugang einrichtet. Die Nutzung eines derartigen Accounts unter macOS und Linux ist vollkommen unkompliziert, zum erstmaligen Aus-Checken reicht ein Kommando:

svn co svn+ssh://<user-name>@<host-name>/home/svn-repos/mein-projekt

Danach cd mein-projekt, svn update, svn add datei, svn commit -m 'bla bla' etc.

Was aber, wenn auf dem Client-Rechner Windows läuft? Dann ist — wie immer — alles ein wenig komplizierter. Diese Anleitung zeigt, wie Sie mit Putty und TortoiseSVN ans Ziel kommen.

TortoiseSVN

Mit TortoiseSVN existiert für Windows ein sehr komfortabler SVN-Client. Allerdings handelt es sich dabei nicht um ein Programm mit eigenständiger Benutzeroberfläche; vielmehr integriert sich TortoiseSVN in den Datei-Manager (Windows Explorer) ein und wird dort über Kontextmenükommandos gesteuert.

Um erstmalig den SVN-Dateibaum herunterzuladen, öffnen Sie im Datei-Manager ein Verzeichnis (z.B. »Dokumente«, führen per Kontextmenü SVN Checkout aus. Als URL geben Sie gemäß dem Beispiel aus SVN-Server für den SSH-Zugriff einrichten die Zeichenkette svn+ssh://<user-name>@<host-name>/home/svn-repos/mein-projekt an.

Der Checkout-Dialog von TortoiseSVN wird über ein Kontextmenükommand des Windows-Explorers geöffnet
Der Checkout-Dialog von TortoiseSVN wird über ein Kontextmenükommand des Windows-Explorers geöffnet

TortoiseSVN fragt nun zweimal nach dem SSH-Passwort und richtet dann das Projektverzeichnis ein. Für dieses Verzeichnis können Sie in der Folge per Kontextmenü SVN Checkout und SVN Commit ausführen. Für neue Dateien in diesem Verzeichnis können Sie nun TortoiseSVN / Add ausführen. Bei Dateien, die bereits unter SVN-Kontrolle sind, fällt das Menü wesentlich ausführlicher aus.

Für Dateien unter SVN-Kontrolle stellt das Kontextmenü im Windows Explorer viele Kommandos zur Auswahl
Für Dateien unter SVN-Kontrolle stellt das Kontextmenü im Windows Explorer viele Kommandos zur Auswahl

Bis hierher funktioniert TortoiseSVN ausgesprochen gut, selbst Kommandozeilen-verliebte Leute wie ich könnten sich damit anfreunden :-) Lästig ist aber, dass das SSH-Passwort immer wieder neu eingegeben werden muss. Die Lösung unter Linux bestünde darin, mit ssh-keygen einen nicht durch ein Passwort gesicherten Schlüssel einzurichten und den öffentlichen Teil mit ssh-copy-id zum SSH-Server hochzuladen. Zwei Kommandos, Zeitaufwand: 20 Sekunden. Diese Kommandos stehen unter Windows aber leider nicht zur Verfügung.

Hinweis: Sowohl ssh-copy-id als auch die im folgenden beschriebene Vorgehensweise setzen voraus, dass der SSH-Login nicht nur für SVN verwendet werden kann, sondern auch zum lokalen Arbeiten auf dem Server. Die SVN-Server-Konfigurationsvariante mit lshell ist dazu nicht geeignet.

SSH-Authentifizierung per Schlüssel

Aber wo ein Wille ist, ist auch ein Weg, selbst unter Windows. Um dort einen für SSH geeigneten Schlüssel einzurichten, laden Sie PuTTYgen.exe herunter und führen das Programm aus. Mit Generate erzeugen Sie den neuen Schlüssel, wobei Sie alle Voreinstellungen belassen. Mit Save public key speichern Sie dann den öffentlichen Teil des Schlüssel in einer Textdatei, den privaten (geheimen) Schlüssel in einer PPK-Datei.

PuTTYgen.exe hat einen neuen Schlüssel generiert. Der öffentliche und der private Teil müssen nun in zwei Dateien gespeichert werden.
PuTTYgen.exe hat einen neuen Schlüssel generiert. Der öffentliche und der private Teil müssen nun in zwei Dateien gespeichert werden.

Als nächsten müssen Sie den öffentlichen Schlüssel in Textform der Datei /home/<ihrlogin>/.ssh/authorized_keys auf dem Server hinzufügen. Dazu stellen Sie mit PuTTY eine SSH-Verbindung zum Server her. Dort testen Sie zuerst, ob die Datei authorized_keys schon existiert. Ist das nicht der Fall, führen Sie via PuTTY die folgenden Kommandos aus:

mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

Anschließend öffnen Sie authorized_keys mit einem Texteditor (z.B. nano), kopieren aus PuTTYgen oder aus der zuvor eingerichteten Textdatei den öffentlichen Schlüssel und fügen diese via PuTTY in die Datei ein. Achten Sie darauf, dass Sie den gesamten öffentlichen Schlüssel in einer Zeile einfügen. Wenn authorized_keys bisher nicht existierte, muss die Datei anschließend so ähnlich wie das folgende Muster aussehen:

ssh-rsa AAAAB3...4ES5N6 rsa-key-20161106

Der Sinn dieser Aktion besteht darin, dass PuTTY in Zukunft überprüfen kann, ob der öffentliche Teil des Schlüssels auf dem SSH-Server mit dem privaten Schlüssel übereinstimmt. Für diese Art der Authentifizierung müssen Sie in PuTTY ein neues Profil mit den folgenden Einstellungen einrichten:

  • Hostname = username@host-name
  • Private key file = C:\Users\ihrname\wo-auch-immer\privatekey.ppk

Nachdem Sie alles konfiguriert haben, kehren Sie nochmals in das Sessions-Dialogblatt zurück und klicken auf Save.

Neues Profil in PuTTY einrichten
Neues Profil in PuTTY einrichten
PuTTY soll zur Authentifizierung beim Server die private Schlüsseldatei des lokalen Windows-Rechners verwenden.
PuTTY soll zur Authentifizierung beim Server die private Schlüsseldatei des lokalen Windows-Rechners verwenden.

Wenn bis dahin keine Fehler passiert sind, gelingt nun mit einem Doppelklick auf die neu eingerichtete Session der SSH-Verbindungsaufbau zum Server — ohne Login. (Damit sollte hoffentlich auch klar sein, dass die private Schlüsseldatei wirklich privat bleiben soll. Wem auch immer die Datei in die Hände gerät, er/sie kann nun ebenfalls ohne Passwort einen Login durchführen!)

Die PuTTY-Session in TortoiseSVN nutzen

Vielleicht haben Sie sich zwischendurch schon gefragt, wozu der ganze Aufwand mit PuTTY dienen soll. Die Antwort ist einfach: TortoiseSVN kann die in einer PuTTY-Session gespeicherten Einstellungen verarbeiten! Dazu nennen Sie ihr bisheriges SVN-Verzeichnis in svn-backup um und führen dann im Windows Explorer neuerlich per Kontextmenü SVN Checkout aus. Diesmal geben Sie die URL aber in dieser Form an:

svn+ssh://user-name@putty-session-name/home/svn-repos/mein-projekt

Entscheidend ist, dass Sie statt dem Hostnamen den Namen der PuTTY-Session verwenden!

In der Tortoise-URL kann statt eines Hostnames auch der Name eine PuTTY-Session angegeben werden.
In der Tortoise-URL kann statt eines Hostnames auch der Name eine PuTTY-Session angegeben werden.

Wenn alles gut geht, gelingt TortoiseSVN nun der Verbindungsaufbau ohne lange Passwort-Fragerei — sowohl jetzt, als auch in Zukunft.

Quellen / Links