Warum nicht einfach% h in der ControlPath-Option von OpenSSH ssh verwenden?

12

Warum die „ssh_config (5)“ do manpages empfehlen , dass die ControlPathOption zumindest die enthalten soll %h, %pund %rPlatzhalter , um eindeutig zu identifizieren jede gemeinsam genutzte Verbindung?

Ich dachte, dass mehrere Sitzungen den gleichen Socket mit einer Verbindung zum gleichen Host teilen sollten . Wäre es nicht sinnvoll, eine einfache Definition zu haben wie:

ControlPath ~/.cache/ssh/mux/%h

Anstelle von etwas wie:

ControlPath ~/.cache/ssh/mux/%r@%h:%p

Nach meinem Verständnis wird mit der ersten Definition eine Verbindung zwischen mehreren Sitzungen mit verschiedenen Remotebenutzern zu demselben Remotehost an verschiedenen Remoteports geteilt.

Ich möchte die erste Definition im Host-Standardabschnitt haben, damit es genügt zu sagen ssh -o ControlMaster=no.

Ich möchte die Verbindung zu demselben Remote-Host für alle Sitzungen freigeben, die von demselben lokalen Benutzer initiiert wurden, unabhängig vom Remote-Benutzer und Remote-Port. Der Socket des Master-Clients sollte sich unter dem Basisverzeichnis des lokalen Benutzers befinden.

Tim Friske
quelle
"Ich möchte die Verbindung zu demselben Remote-Host für alle Sitzungen freigeben, die von demselben lokalen Benutzer initiiert wurden, unabhängig vom Remote-Benutzer und Remote-Port." Kurze Antwort: Das kannst du nicht . Ich habe meiner Antwort eine Art Erklärung hinzugefügt.
Goldlöckchen

Antworten:

12

"Ich dachte, dass mehrere Sitzungen denselben Socket mit einer Verbindung zum selben Host teilen sollten."

Sie können. Beachten Sie jedoch, dass Sie ControlPathals der ursprüngliche Benutzer der Verbindung angemeldet sind, wenn Sie eine Verbindung mit einem Host über herstellen , und zwar unabhängig davon, unter welchem ​​Benutzer Sie sich anmelden möchten. ZB ohne bestehende Verbindung zu "irgendwo":

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=yes bob@somewhere

Diese Sitzung findet irgendwo statt.

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=no sue@somewhere

Diese Sitzung wird auch irgendwo bob @ sein, da Sie denselben ControlPath und dieselbe Einstellung verwendet haben ControlMaster=no. Wenn ControlMaster=yes, würden Sie als Sue angemeldet sein, aber ssh wird Ihr ControlPath-Argument ignoriert haben, wie impliziert in man ssh_config:

Zusätzliche Sitzungen können über denselben ControlPath mit ControlMaster auf 'no' an diesen Socket angeschlossen werden .

Dies ist ein Beweis dafür, dass ControlMaster=yesin beiden Fällen der ControlPath-Socket beim Beenden von bob ~/.ssh/somewhereverschwindet, obwohl die "Sue" -Sitzung noch ausgeführt wird, was bedeutet, dass die Sue-Sitzung diesen Socket nie verwendet hat .

Wenn Sie also dieselbe Verbindung verwenden möchten, %hist dies in Ordnung. Beachten Sie jedoch, dass Sie eine Verbindung nicht als mehrere verschiedene Remotebenutzer freigeben können - ssh lässt Sie nicht zu.

Goldlöckchen
quelle
Danke vielmals. Vor Ihrer ausführlichen Antwort habe ich die Tatsache übersehen, dass es nicht möglich ist, den Master-Socket eines Clients für verschiedene Remotebenutzer freizugeben, ohne dass der zweite Remotebenutzer gleichzeitig die Identität des ersten Benutzers annimmt.
Tim Friske
5

Sie könnten sogar für denselben Server mehrere Benutzer und mehrere Ports verwenden. Ich selbst verbinde mich mit Hunderten von Systemen im Intranet des Unternehmens, die meisten haben mehrere Benutzer mit unterschiedlichen Funktionen oder App-Servern. Der Zugriff auf BenutzerA unterscheidet sich erheblich vom Zugriff auf BenutzerB, und die Master-Verbindung muss unterschiedlich sein. Um es kurz zu machen:

$ ssh -n -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userA localhost sleep 10 & # create the master connection and background it
$ ssh -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userB localhost whoami
userA

Wie Sie sehen, erhalten wir keine OpenSSH-Sitzung mit userB, sondern das Original mit userA. Das bedeutet, dass das Basisverzeichnis, die Berechtigungen und sogar die Authentifizierung selbst nicht den Erwartungen entsprechen. Wenn Sie versuchen, eine Datei im Verzeichnis von Benutzer B zu löschen, könnte dies a) die falsche Datei und b) die falschen Berechtigungen sein.

Wenn Sie niemals eine Verbindung zu mehr als einem Benutzer auf einem Server über einen einzelnen Port herstellen, ist die Verwendung von %hmöglicherweise ausreichend. In Ihrer ~/.ssh/configDatei möchten Sie Folgendes verwenden:

ControlMaster=auto  # use existing or create a master connection
ControlPath=~/.cache/ssh/mux/%h
ControlPersist=yes

Mit der ControlPersistOption bleibt die Masterverbindung im Hintergrund geöffnet, bis sie beendet oder mit beendet wird ssh -O exit. Dies ist eine nette Funktion zum Festlegen und Vergessen.

Aber wenn es irgendeine Möglichkeit , auf einem Host , um mehr als einen Benutzer zu verbinden, dann würden Sie etwas sicherer:

ControlMaster=auto
ControlPath=~/.cache/ssh/mux/%r@%h:%p
ControlPersist=yes
Arcege
quelle
Ich bin immer noch verwirrt. Ich habe versucht, das Konfigurationsszenario und meine Absicht in den Absätzen "Ich möchte" zu verdeutlichen. Könnte jemand von Ihnen meine Frage mit diesen zusätzlichen Informationen genauer beantworten?
Tim Friske