Frage (TL; DR)
-R
Wie 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 -X
Option weiterzuleiten . Die zugewiesene X-Adresse wird in der Umgebungsvariablen gespeichert DISPLAY
und 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_SERVER
und PULSE_SERVER
sind. 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_SERVER
und PULSE_SERVER
korrekt.
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 0
als Bindungsport für die Remote-Weiterleitung angegeben wird (die -R
Option). 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, ssh
wird 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_SERVER
und PULSE_SERVER
auf dem Remote-Host zu speichern?
Sackgassen
Das einzig leichte, was ich finden konnte, war die Erhöhung der Ausführlichkeit der, sshd
bis 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 sshd
nicht 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
,55710
und6010
; Tassen, Puls und X.6010
wird als X-Port mit identifiziertDISPLAY
.41273
ist der Tassenport, weillpstat -h localhost:41273 -a
zurückkehrt0
.55710
ist der Impulsport, weilpactl -s localhost:55710 stat
zurückkehrt0
. (Es gibt sogar den Hostnamen meines Kunden aus!)
(Um die eingestellte Subtraktion I durchzuführen sort -u
und die Ausgabe über die obigen Befehlszeilen zu speichern und comm
die 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
, 55710
und 6010
auf den gleichen sshd
Prozess. netstat
gibt diese Informationen nicht an Nicht-Root-Benutzer weiter. Ich bekomme nur eine -
in der PID/Program name
Spalte, in der ich lesen möchte 2339/54
(in diesem speziellen Fall). So nah ...
netstat
Ihnen die PID für Prozesse, die Sie nicht besitzen oder die Kernel-Space sind , nicht angezeigt wird . Zum Beispiel