SSH nervt, wenn die WLAN-Verbindung immer wieder abbricht, sich die IP-Adresse ändert, die Datenpakete über GSM nur tröpfeln und man das Getippte erst nach Sekunden zu Gesicht bekommt. Glücklicherweise gibt es AutoSSH und Mosh.
SSH ist für den Linux-Admin das Programm der Wahl, wenn es darum geht, sich per Kommandozeile auf einem entfernten Linux- oder BSD-Rechner einzuloggen. Allerdings kann SSH auch Nerven kosten – etwa, wenn die Verbindung in einem wackeligen Netz immer wieder abbricht oder die Datenpakete über GSM oder SkyDSL nur tröpfeln. Das selbe gilt, wenn man den Laptop mal kurz schlafen legt oder in ein anderes Netzwerk wechselt und sich danach die IP-Adresse geändert hat. Die beiden Programme AutoSSH und Mosh gehen diese Problematik von ganz unterschiedlichen Seiten her an.
AutoSSH
AutoSSH [1] gibt es bereits seit über zehn Jahren. Es arbeitet als Wrapper um das normale SSH. Bedingt durch dieses Prinzip beherrscht AutoSSH fast alles, was SSH auch kann, weist aber auch fast alle Nachteile der SSH auf.
Der Unterschied zwischen einer normalen SSH-Verbindung und einer via AutoSSH liegt darin, dass AutoSSH die Verbindung überwacht und sie bei einem Abbruch automatisch mit den gleichen Parametern neu startet – also mit den gleichen Tunnels und dem selben auf dem entfernten Rechner auszuführenden Kommando.
Die Verbindungsüberwachung von AutoSSH geschieht durch zwei eigene Port-Weiterleitungen. AutoSSH richtet diese zusätzlich zu gegebenenfalls vom Benutzer gewünschten Port-Weiterleitungen ein, jeweils eine in Hin- und eine in Rückrichtung (Abbildung 1). Beide sind auf dem entfernten Rechner so miteinander verbunden, dass Daten, die Sie über die eine Weiterleitung senden, auf dem entfernen Rechner direkt wieder in die andere wandern und auf diesem Weg wieder bei Ihnen eintreffen. Bleiben sie aus, terminiert AutoSSH die bestehende Verbindung und versucht sie anschließend neu aufzubauen (Listing 1).
Listing 1
user@lokaler.pc$ autossh remote.pc Willkommen auf remote.pc! user@remote.pc $ Connection to remote.pc closed. ssh: connect to host remote.pc port 22: Connection timed out ssh: connect to host remote.pc port 22: Connection timed out Willkommen auf remote.pc! user@remote.pc $ exit Connection to remote.pc closed. user@lokaler.pc $
Im Syslog finden sich danach folgende Meldungen:
autossh: starting ssh (count 1) autossh: ssh child pid is 18851 autossh: ssh exited with error status 255; restarting ssh autossh: starting ssh (count 2) autossh: ssh child pid is 19061 autossh: ssh exited with status 0; autossh exiting
Sofern auf dem entfernten Rechner GNU Screen installiert ist, können Sie sich mithilfe des Kommandos
$ autossh Remote-Rechner -t 'screen -RD'
auf dem entfernten Rechner zu einer existierenden Screen-Session verbinden, oder – wenn noch keine existiert – ein neue starten. Registriert AutoSSH einen Verbindungsabbruch, dann ruft es nach dem erneutem erfolgreichem Aufbau der SSH-Verbindung automatisch wieder screen -RD auf dem entfernten Rechner auf. Da dieses Mal eine Screen-Session existiert, verbindet es zu dieser.
Auf diese Weise arbeiten Sie mit der Kombination aus AutoSSH und GNU Screen recht schnell wieder an der Stelle weiter, an der Sie – beispielsweise durch einen IP-Wechsel – unterbrochen wurden.
Bemerken Sie noch vor AutoSSH, dass die Verbindung unterbrochen würde, terminieren Sie diese einfach mithilfe der SSH-Escape-Sequenz Eingabetaste, Tilde, Punkt – das entspricht [Eingabe],[Alt]+[+],[Leertaste],[.] beim deutschen Tastaturlayout mit toter Tilde-Taste. AutoSSH startet die Verbindung daraufhin direkt wieder neu.
Mosh
Bei der “mobilen Shell” Mosh [2] handelt es sich um eine Neuentwicklung aus den vergangenen zwei Jahren. Sie hat zum Ziel, auf den heutigen mobilen Endgeräten das entfernte Arbeiten per Kommandozeile zu ermöglichen, ohne dass die von TCP-Verbindungen her bekannten Probleme auftreten: TCP- und damit auch SSH-Verbindungen vertragen keinen Wechsel der IP-Adresse und werden bei schlechten Verbindungen empfindlich langsamer [3].
Eine Mosh-Sitzung bricht im Gegensatz zu einer SSH-Sitzung nie endgültig ab. Deswegen braucht man mit Mosh auch keinen Wachhund plus künstliches Terminal mehr, wie das Duo AutoSSH und GNU Screen. Allerdings bedient sich Mosh intern ähnlicher Techniken wie Screen.
Sie melden sich von Ihrem Laptop, Netbook oder Linux-Smartphone aus per Mosh auf dem Server an und bleiben dort angemeldet. Dabei spielt es keine Rolle, ob Sie in der Zwischenzeit vom WLAN auf UMTS gewechselt haben, die Internetverbindung zwischendurch einmal verloren ging oder der Laptop ein, zwei Tage im Suspend war: Solange auf keinem der beiden verbundenen Geräte der Mosh-Prozess beendet wurde, ist die Verbindung sofort wieder da, sobald Sie wieder eine Netzwerkverbindung zwischen den Rechnern herstellen.
Aber Mosh bietet nicht nur bei wechselnden, sondern auch bei langsamen oder unzuverlässigen Internet-Verbindungen Vorteile, beispielsweise bei solchen über Satellit, bei schlechtem Mobilfunk-Empfang oder einem wackeligen WLAN.
Mosh für alle
Mosh ist als freie Software unter der GNU GPLv3 verfügbar. Viele gängige Distributionen stellen auch Binärpakete oder Ports bereit, darunter Debian (via Backports), Ubuntu (via PPA), Gentoo, Arch Linux (via AUR), Fedora, Mageia und Slackware. Daneben gibt es Mosh auch für Mac OS X (via Homebrew, MacPorts oder als Pkg-Paket) und in den FreeBSD Ports. An einem Android-Client arbeiten die Entwickler gerade [4]. Für diverse Umgebungen und Geräte, wie etwa das Nokia N9 oder für Cygwin unter Windows liefert das Mosh-Wiki von der Community gepflegte Installationsanleitungen [5].
Blick in die Glaskugel
Sobald Mosh merkt, dass die Latenz für interaktives Arbeiten zu hoch oder die Datenrate zu niedrig ist, versucht es vorherzusagen, welche Änderung an der Terminalausgabe ein gemachter Tastendruck hervorrufen wird, und zeigt das interpolierte Ergebnis bereits an, bevor das tatsächliche Resultat über die Leitung zurückkommt. Das erweist sich besonders dann als angenehm, wenn man auf dem entfernten Rechner mehr als nur ein paar Worte tippt – sei es beim Erstellen einer E-Mail mit Mutt, beim Chatten via Irssi, bei der Eingabe eines längeren Kommandos oder auch einfach nur beim Editieren einer Textdatei in Vim.
Auch wenn man blind schreibt, merkt man manchmal, dass man sich vertippt hat, weiß aber oft nicht mehr genau, bei welchem Zeichen das war. Dann muss man normalerweise warten, bis alle bereits getippten Zeichen auch im Terminal erscheinen, und kann erst dann das bereits Getippte korrigieren. Mit Mosh ist das viel einfacher: Nach wenigen getippten Zeichen merkt Mosh, dass es sich um Text handelt, der auch wieder angezeigt wird (etwa im Einfüge-Modus von Vim) und fängt an, bereits getippte, aber noch nicht wieder vom entfernten Rechner zurückgekommene Zeichen auszugeben.
Falls die getippten Zeichen dann doch nicht wie erwartet zurückkommen, etwa bei automatischem Zeilenumbruch, korrigiert Mosh die Anzeige. Und damit man auch weiß, was bereits von der Gegenstelle zurückkam und was Mosh bisher nur vorhergesagt hat, unterstreicht es die vorhergesagten Zeichen (Abbildung 2).

Abbildung 2: Mosh bemerkt die unterbrochene Verbindung, aber Sie können trotzdem in aller Ruhe weitertippen.
Arbeiten Sie also über eine Verbindung mit hoher Latenz, zeigen sich immer die letzten paar getippten Wörter unterstrichen. Während die Unterstreichung rechts den frischen Eingaben folgt, verkürzt sie sich auf der linken Seite, sobald nach und nach die Zeichen vom entfernten Rechner hereintröpfeln. Es sieht fast so aus, als würde jemand unter dem Getippten “Snake” spielen.
Bei Fehleingaben erkennt man sofort, wo und wie man sich vertippt hat, und kann ohne Verzögerung eine Korrektur vornehmen, auch wenn der Vertipper vom entfernten Rechner noch nicht zurückgesendet wurde.
Die Technik hinter Mosh
Wie schafft Mosh nach knapp zwei Jahren Entwicklung Dinge, die SSH in mehr als 15 Jahren nicht gelernt hat? Wie kommt es, dass nach so langer SSH-Vorherrschaft beim entfernten Einloggen plötzlich wieder neuer Schwung in diesen Bereich kommt? Die Antwort ist einfach und kompliziert zugleich: Mosh hat nur Teile des Rads neu erfunden – die, bei denen es unumgänglich war.
Mosh nutzt zur Synchronisation der Anzeige auf dem lokalen Terminal ein neue entwickeltes Protokoll namens State Synchronization Protocol (SSP), also zu deutsch etwa “Zustandssynchronisationsprotokoll”. SSP setzt statt auf TCP auf UDP auf und braucht damit weniger Netzwerkressourcen für die Verbindungsverwaltung als die TCP-Verbindungen von SSH. Gleichzeitig erlaubt SSP auch ein Roaming, also das Wechseln der IP-Adresse des lokalen Rechners.
Beibehalten hat Mosh vor allem Dinge, die SSH von Haus aus gut und zuverlässig erledigt, wie die Authentifizierung (“Wer loggt sich ein?”) und die Autorisierung (“Darf der das?”). Für diese Zwecke nutzt es selbst eine SSH-Verbindung. Über diese wird dann auch der Mosh-Server gestartet und Sitzungsschlüssel zwischen ihm und dem Mosh-Client ausgetauscht. Danach beendet das Tool die anfängliche SSH-Verbindung wieder und Mosh arbeitet nun noch über seine eigene, UDP-basierte und AES-128 verschlüsselte SSP-Verbindung.
Insofern stellt Mosh weniger eine Konkurrenz für SSH dar als vielmehr eine funktionelle Ergänzung. Zusammengefasst läuft eine Mosh-Sitzung unter der Haube wie folgt ab:
- Der Mosh-Client ruft einen SSH-Client auf (zurzeit OpenSSH) und verbindet sich per SSH mit dem Server. Dabei unterstützt es alle gängigen SSH-Methoden zur Authentifizierung und Autorisierung (Passwort, SSH-Schlüssel, etc.).
- Auf dem Server wird über die SSH-Verbindung der Mosh-Server gestartet. Er teilt dem Mosh-Client über die SSH-Verbindung mit, auf welchem UDP-Port er lauscht und wie der Sitzungsschlüssel lautet.
- Der Mosh-Client eröffnet eine mit dem Session-Key verschlüsselte Verbindung zum genannten UDP-Port des Mosh-Servers.
- Schließlich beendet Mosh die initiale SSH-Verbindung, die Sitzung läuft jetzt nur noch via UDP.
Sobald die vom Mosh-Server-Prozess gestartete Shell oder sonstige Textmodus-Anwendung sich beendet, terminiert der Mosh-Server erst die Verbindung zum Mosh-Client und beendet dann auch sich selbst.
Nachteile von Mosh
Im Vergleich zu SSH räumt Mosh zwar einige Probleme aus dem Weg, die bei schlechten Netzwerkverbindungen auftreten. Deswegen ist Mosh aber noch lange kein kompletter Ersatz für all die Dinge, die SSH sonst noch so kann.
Mit SSH und GNU Screen meldet man sich typischerweise etwa im Büro per SSH auf einem Server an und startet dort GNU Screen. Später loggt sich dann von zuhause aus ebenfalls per SSH auf dem Server ein, wo man nun die Screen-Sitzung übernimmt. Mit Mosh klappt das ohne GNU Screen nicht, da hier Client- und Server-Prozess immer ein Pärchen bilden und Mosh das Verbinden von einem anderen Rechner aus nicht vorsieht.
In die gleiche Kerbe schlägt der Fakt, dass der Mosh-Server-Prozess auf dem entfernten Rechner nicht merkt, wenn beispielsweise einem Laptop, von dem aus Mosh gestartet wurde, die Batterie ausgeht und damit der Prozess am andere Ende der Verbindung nicht mehr existiert. Man muss sich dann erneut auf dem entfernten Rechner anmelden und den verwaisten Mosh-Server-Prozess manuell beenden.
Ein weiteres Manko stellt die derzeit noch fehlende Unterstützung für IPv6 dar. Diese befindet sich zwar bereits in Planung, wirft aber auch neue Probleme auf – etwa, auf welche Weise sich der Wechsel einer laufenden Verbindung von IPv4 auf IPv6 oder umgekehrt implementieren lässt.
Auch kann Mosh anders als SSH noch keine Dateien übertragen oder Netzwerk-Ports auf den oder vom entfernten Rechner weiterleiten. Viele solcher Features werden zwar auf der Mosh-Mailingliste diskutiert (zum Teil sogar recht emotional), aber bei vielen erscheint fraglich, ob die Entwickler sie jemals implementieren. Hingegen stehen das Tunneln von X11-Anwendungen und das Weiterleiten des SSH-Agenten bereits offiziell auf der Roadmap.
Fazit
Sowohl AutoSSH wie auch Mosh erweisen sich als nützliche Helfer für Anwender, die sich oft von mobilen Geräten aus über schlechte oder langsame Verbindungen per SSH auf einem anderen Rechner anmelden. Beide Tools haben ihre Nischen, die sich auch etwas überlappen.
AutoSSH nimmt zusammen mit GNU Screen vor allem bei häufigen IP-Wechsel oder Schlafenlegen des Laptops Arbeit ab, hilft jedoch nicht bei hoher Latenz, wie bei Verbindungen via Satellit. AutoSSH kann wie SSH beliebige Netzwerk Ports weiterleiten. Getunnelte X-Anwendungen überleben allerdings den Neustart der darunterliegenden SSH-Verbindung auch nicht.
Mosh hilft ebenfalls bei häufigem IP-Wechsel, vor allem aber bei hoher Latenz. Andererseits eignet es sich aber nur mäßig, um von verschiedenen Rechner aus auf die selbe Shell zuzugreifen: Dann kommt man um den Einsatz von GNU Screen nicht herum. Ganz passen muss Mosh (zumindest momentan) bei Verbindungen, bei denen es mittels SSH-Agent einen SSH-Key auf den entfernten Rechner weiterzuleiten gilt, sowie auf Rechnern, die sich nur via IPv6 erreichen lassen.
Danksagung
Der Autor bedankt sich bei Frank Hofmann für seine kritischen Anmerkungen und Kommentare im Vorfeld dieses Artikels.
Infos
[1] AutoSSH: http://www.harding.motd.ca/autossh/
[2] Mosh: http://mosh.mit.edu
[3] SSH over UDP: http://publications.lib.chalmers.se/records/fulltext/123799.pdf
[4] Mosh für Android: https://github.com/keithw/mosh/issues/32
[5] Installations-Anleitungen: https://github.com/keithw/mosh/wiki/Distribution-specific-installation






