Die Konfiguration
mkdir -m 700 ~/.ssh/cm
Host server
HostName example.com
User user
ControlMaster auto
ControlPath ~/.ssh/cm/%C
ControlPersist 10m
ControlMaster autonutzt eine vorhandene Verbindung, falls es eine gibt, und öffnet sonst eine neue, die andere mitbenutzen können.ControlPathist die Socket-Datei, über die Sitzungen die Verbindung finden.%Cist ein Hash aus lokalem Host, entferntem Host, Port, Benutzer und Jump-Host, damit verschiedene Anmeldungen nicht durcheinandergeraten.ControlPersist 10mhält die Verbindung 10 Minuten nach dem Ende der letzten Sitzung offen. Mitno, dem Standard, lebt die Verbindung im erstenssh, das Sie gestartet haben, und das bleibt offen, bis alle Sitzungen darauf beendet sind. Mityesbleibt 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
| Befehl | Was er tut |
|---|---|
ssh -O check server | Gibt Master running (pid=1534) aus, Exit-Code 0 |
ssh -O conninfo server | Zeigt Adressen und Algorithmen der Verbindung |
ssh -O forward -L 8080:localhost:80 server | Fügt der offenen Verbindung eine Portweiterleitung hinzu |
ssh -O cancel -L 8080:localhost:80 server | Entfernt diese Weiterleitung |
ssh -O stop server | Nimmt keine neuen Sitzungen an, laufende Sitzungen laufen weiter |
ssh -O exit server | Schließ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.