SSH-Multiplexing mit ControlMaster und ControlPersist

Tragen Sie ControlMaster auto, ControlPath ~/.ssh/cm/%C und ControlPersist 10m in einen Host-Block in ~/.ssh/config ein und legen Sie den Ordner mit mkdir -m 700 ~/.ssh/cm an. Das erste ssh öffnet die Verbindung, spätere nutzen sie ohne erneute Anmeldung mit. ssh -O check server zeigt, ob sie läuft, und ssh -O exit server schließt sie.

Die Dateien eines Servers sehen, ohne ein zweites Terminal zu öffnen? In Wardterm öffnen sie sich neben der Sitzung, im Ordner, in dem die Shell gerade ist. Zeigen

Aktualisiert am . OpenSSH-10.0-Client zu OpenSSH 10.0 unter Debian 13 in Wegwerf-Containern.

Die Konfiguration

mkdir -m 700 ~/.ssh/cm
Host server
  HostName example.com
  User user
  ControlMaster auto
  ControlPath ~/.ssh/cm/%C
  ControlPersist 10m
  • ControlMaster auto nutzt eine vorhandene Verbindung, falls es eine gibt, und öffnet sonst eine neue, die andere mitbenutzen können.
  • ControlPath ist die Socket-Datei, über die Sitzungen die Verbindung finden. %C ist ein Hash aus lokalem Host, entferntem Host, Port, Benutzer und Jump-Host, damit verschiedene Anmeldungen nicht durcheinandergeraten.
  • ControlPersist 10m hält die Verbindung 10 Minuten nach dem Ende der letzten Sitzung offen. Mit no, dem Standard, lebt die Verbindung im ersten ssh, das Sie gestartet haben, und das bleibt offen, bis alle Sitzungen darauf beendet sind. Mit yes bleibt sie offen, bis Sie sie schließen.

In unserem Test, zwischen zwei Containern auf einem Rechner, brauchte das erste ssh server true 74 ms und das zweite 3 ms. Das zweite überspringt den Schlüsselaustausch und die Anmeldung, daher gibt es auch keine neue Passwort- oder Passphrase-Abfrage. In einem echten Netz ist die erste Anmeldung langsamer, der Unterschied also größer.

Derselbe Block kann die übrigen Einstellungen des Hosts enthalten. Mehr dazu in Beispiele für die SSH-Konfigurationsdatei.

Die Verbindung steuern

BefehlWas er tut
ssh -O check serverGibt Master running (pid=1534) aus, Exit-Code 0
ssh -O conninfo serverZeigt Adressen und Algorithmen der Verbindung
ssh -O forward -L 8080:localhost:80 serverFügt der offenen Verbindung eine Portweiterleitung hinzu
ssh -O cancel -L 8080:localhost:80 serverEntfernt diese Weiterleitung
ssh -O stop serverNimmt keine neuen Sitzungen an, laufende Sitzungen laufen weiter
ssh -O exit serverSchließt die Verbindung und jede Sitzung darauf
ssh -S none serverÖffnet eine eigene Verbindung und ignoriert die geteilte

Läuft nichts, endet -O check mit Exit-Code 255:

Control socket connect(/home/user/.ssh/cm/936446a2...): No such file or directory

Grenzen und Fallen

Alle Sitzungen teilen ein Schicksal

Stirbt die Verbindung, sterben alle Sitzungen darauf. In unserem Test beendete ssh -O exit eine laufende Sitzung mit Exit-Code 255. Auch das Escape-Zeichen ~. beendet alle Sitzungen der Verbindung, wie ssh selbst in seiner ~?-Liste sagt.

Der Server begrenzt die Sitzungen pro Verbindung

MaxSessions in sshd_config steht standardmäßig auf 10. Wir haben 12 Sitzungen gleichzeitig geöffnet, und die letzten 2 scheiterten mit:

mux_client_request_session: session request failed: Session open refused by peer

Diese Befehle sind komplett gescheitert. Sie sind nicht auf eine neue Verbindung ausgewichen, daher brauchen Skripte, die viele Befehle parallel ausführen, ein höheres Limit oder -S none.

Der Socket-Pfad kann zu lang sein

Pfade von Unix-Sockets haben eine kurze Längengrenze. Ein zu langer Pfad stoppt die Verbindung:

unix_listener: path "/very/long/path/..." too long for Unix domain socket

Ein kurzer Ordner mit %C vermeidet das. Der Hash hat eine feste Länge, anders als %r@%h:%p.

Der Socket gibt Zugriff ohne Anmeldung

Wer die Socket-Datei benutzen kann, kann ohne Passwort Sitzungen auf Ihrer Verbindung öffnen. Legen Sie sie in einen Ordner, in den nur Sie schreiben dürfen, deshalb hat ~/.ssh/cm den Modus 700. Auch das Handbuch warnt davor.

Langlebige Tunnel sollten eine eigene Verbindung haben

Eine Weiterleitung, die über eine geteilte Verbindung gestartet wird, gehört dem Master. In unserem Test gab ein zweites ssh -f -N -o ExitOnForwardFailure=yes -R 2222:localhost:22 server auf einem bereits belegten Port bei eingeschaltetem Multiplexing den Exit-Code 0 zurück. Ohne Multiplexing gab derselbe Befehl einen Fehler aus und lieferte 255. Für einen Tunnel, auf den sich Skripte verlassen, fügen Sie -S none hinzu.

Ein beendeter Master hinterlässt einen veralteten Socket

Nach einem kill -9 auf den Master bleibt die Socket-Datei bestehen und -O check meldet Connection refused. Das nächste normale ssh server funktionierte in unserem Test trotzdem und ersetzte den Socket. Falls es einmal hängt, löschen Sie die Datei in ~/.ssh/cm.

Fragen

Ist SSH-Multiplexing sicher?

Ja, wenn der Socket in einem Ordner liegt, in den nur Sie schreiben können, etwa ~/.ssh/cm mit Modus 700. Wer den Socket nutzen kann, öffnet ohne Anmeldung Sitzungen auf Ihrer Verbindung.

Funktioniert ControlMaster mit dem OpenSSH-Client von Windows?

Der OpenSSH-Client, der mit Windows kommt, unterstützt ControlMaster nicht, weil es Unix-Domain-Sockets braucht. In WSL funktioniert es.

Wie schließe ich eine gemeinsam genutzte SSH-Verbindung?

Führen Sie ssh -O exit mit dem Hostnamen aus. Das schließt die Verbindung und alle Sitzungen darauf. ssh -O stop lehnt neue Sitzungen ab und lässt laufende zu Ende gehen.

Quellen

Mehr zu Konfiguration und viele Server

Alle Anleitungen