Frage (TL; DR)
-RWie kann ein Skript auf dem Remotecomputer (z. B. von .bashrc) bestimmen, welche Ports von OpenSSH ausgewählt wurden, wenn Ports dynamisch für die Remoteweiterleitung zugewiesen werden (auch als Option bezeichnet) ?
Hintergrund
Ich verwende OpenSSH (an beiden Enden), um eine Verbindung zu unserem zentralen Server herzustellen, den ich mit mehreren anderen Benutzern teile. Für meine Remote-Sitzung (vorerst) möchte ich X, Tassen und Pulseaudio weiterleiten.
Am trivialsten ist es, X mit dieser -XOption weiterzuleiten . Die zugewiesene X-Adresse wird in der Umgebungsvariablen gespeichert DISPLAYund daraus kann ich in den meisten Fällen sowieso den entsprechenden TCP-Port ermitteln. Aber das brauche ich kaum, denn Xlib ehrt DISPLAY.
Ich brauche einen ähnlichen Mechanismus für Tassen und Pulseaudio. Die Grundlagen für beide Dienste existieren, in Form der Umgebungsvariablen CUPS_SERVERund PULSE_SERVERsind. Hier sind Anwendungsbeispiele:
ssh -X -R12345:localhost:631 -R54321:localhost:4713 datserver
export CUPS_SERVER=localhost:12345
lowriter #and I can print using my local printer
lpr -P default -o Duplex=DuplexNoTumble minutes.pdf #printing through the tunnel
lpr -H localhost:631 -P default -o Duplex=DuplexNoTumble minutes.pdf #printing remotely
mpg123 mp3s/van_halen/jump.mp3 #annoy co-workers
PULSE_SERVER=localhost:54321 mpg123 mp3s/van_halen/jump.mp3 #listen to music through the tunnel
Das Problem setzt CUPS_SERVERund PULSE_SERVERkorrekt.
Wir verwenden häufig Portweiterleitungen, daher benötige ich dynamische Portzuweisungen. Statische Portzuweisungen sind keine Option.
OpenSSH verfügt über einen Mechanismus für die dynamische Portzuweisung auf dem Remote-Server, indem 0als Bindungsport für die Remote-Weiterleitung angegeben wird (die -ROption). Mit dem folgenden Befehl weist OpenSSH dynamisch Ports für Cups und Impulsweiterleitungen zu.
ssh -X -R0:localhost:631 -R0:localhost:4713 datserver
Wenn ich diesen Befehl verwende, sshwird Folgendes gedruckt STDERR:
Allocated port 55710 for remote forward to 127.0.0.1:4713
Allocated port 41273 for remote forward to 127.0.0.1:631
Da sind die Informationen, die ich will! Letztendlich möchte ich generieren:
export CUPS_SERVER=localhost:41273
export PULSE_SERVER=localhost:55710
Die Nachrichten "Zugeordneter Port ..." werden jedoch auf meinem lokalen Computer erstellt und an diesen gesendet STDERR, auf den ich auf dem Remotecomputer nicht zugreifen kann. Seltsamerweise scheint OpenSSH keine Mittel zu haben, um Informationen über Portweiterleitungen abzurufen.
Wie rufe ich diese Informationen ab, um sie in ein Shell-Skript einzufügen, um sie angemessen festzulegen CUPS_SERVERund PULSE_SERVERauf dem Remote-Host zu speichern?
Sackgassen
Das einzig leichte, was ich finden konnte, war die Erhöhung der Ausführlichkeit der, sshdbis diese Informationen aus den Protokollen gelesen werden können. Dies ist nicht praktikabel, da diese Informationen viel mehr Informationen enthalten, als für Nicht-Root-Benutzer sinnvoll sind.
Ich habe darüber nachgedacht, OpenSSH zu patchen, um eine zusätzliche Escape-Sequenz zu unterstützen, die eine schöne Darstellung der internen Struktur druckt permitted_opens, aber selbst wenn ich das möchte, kann ich immer noch kein Skript auf die Client-Escape-Sequenzen von der Serverseite aus ausführen.
Es muss einen besseren Weg geben
Der folgende Ansatz scheint sehr instabil zu sein und ist auf eine solche SSH-Sitzung pro Benutzer beschränkt. Ich benötige jedoch mindestens zwei gleichzeitige Sitzungen und noch mehr Benutzer. Aber ich habe es versucht ...
Wenn die Sterne richtig ausgerichtet sind und ein oder zwei Hühner geopfert haben, kann ich die Tatsache missbrauchen, dass sie sshdnicht als mein Benutzer gestartet wurde, sondern nach erfolgreicher Anmeldung die Berechtigungen aufhebt, um dies zu tun:
Holen Sie sich eine Liste der Portnummern für alle Abhörbuchsen, die meinem Benutzer gehören
netstat -tlpen | grep ${UID} | sed -e 's/^.*:\([0-9]\+\) .*$/\1/'Holen Sie sich eine Liste der Portnummern für alle Abhörbuchsen, die zu Prozessen gehören, die mein Benutzer gestartet hat
lsof -u ${UID} 2>/dev/null | grep LISTEN | sed -e 's/.*:\([0-9]\+\) (LISTEN).*$/\1/'Alle Ports, die sich im ersten Satz, aber nicht im zweiten Satz befinden, sind mit hoher Wahrscheinlichkeit meine Weiterleitungsports, und tatsächlich werden die Erträge der Sätze abgezogen
41273,55710und6010; Tassen, Puls und X.6010wird als X-Port mit identifiziertDISPLAY.41273ist der Tassenport, weillpstat -h localhost:41273 -azurückkehrt0.55710ist der Impulsport, weilpactl -s localhost:55710 statzurückkehrt0. (Es gibt sogar den Hostnamen meines Kunden aus!)
(Um die eingestellte Subtraktion I durchzuführen sort -uund die Ausgabe über die obigen Befehlszeilen zu speichern und commdie Substraktion durchzuführen.)
Mit Pulseaudio kann ich den Client identifizieren. In jeder Hinsicht kann dies als Anker für die Trennung von SSH-Sitzungen dienen, die getrennt werden müssen. Allerdings habe ich nicht gefunden , einen Weg zu binden 41273, 55710und 6010auf den gleichen sshdProzess. netstatgibt diese Informationen nicht an Nicht-Root-Benutzer weiter. Ich bekomme nur eine -in der PID/Program nameSpalte, in der ich lesen möchte 2339/54(in diesem speziellen Fall). So nah ...
netstatIhnen die PID für Prozesse, die Sie nicht besitzen oder die Kernel-Space sind , nicht angezeigt wird . Zum Beispiel