Bei Anschluss an einen Host mit SSH verbinden, in der Regel drei „Rohre“ sind zwischen Wirt und Gast zur Verfügung gestellt, für stdin
, stdout
, und stderr
.
Gibt es eine Befehlszeilenoption, um 3
Weiterleitungen für zusätzliche Dateideskriptoren ( und höher) zu erstellen ?
Zum Beispiel würde ich gerne tun
ssh --forwardfd=10:3 remotehost 'echo test >&3'
Dies würde "test" auf den lokal geöffneten Dateideskriptor 10 ausgeben.
ssh
pipe
file-descriptors
Mäuse
quelle
quelle
closefrom(STDERR_FILENO + 1)
Aufrufe unter dem OpenSSH-Quellcode. Was versuchst du zu tun, das dies verlangt?stdin
/out
/err
, aber AFAIK, kein Server / Client bietet in irgendeiner Weise Unterstützung für diese Funktion.infinite-output-cmd | ssh user@host bash /proc/self/fd/3 3< local-script-to-execute-remotely.sh
--forwardfd
gar nicht gebraucht werden sollte.ssh
Überprüfen Sie die geöffneten Dateideskriptoren, bevor Sie eine andere Funktion öffnen, und leiten Sie sie automatisch an dieselben Dateideskriptoren auf der Remote-Seite weiter. Es könnte völlig transparent sein wie in meinem Beispiel. Ich frage mich, wie schwierig es wäre, dafür zu flickenssh
. Wie Sie sagten, könnte es schwierig sein, abhängig von den Gründen, die dahinter steckenclosefrom(STDERR_FILENO + 1)
.Antworten:
Dazu können Sie die Socket-Weiterleitung verwenden, die seit openssh-6.7 verfügbar ist. Das ist eine Art Pfeife. Diese Technik wird zum Beispiel hier beschrieben: http://www.25thandclement.com/~william/projects/streamlocal.html
Sie erhalten eine Route in zwei Richtungen für Ihre Daten. Es gibt ein Beispiel mit MySQL:
quelle
Ich bin mir sicher, dass es möglich sein sollte. Ich kann nur einen Hack vorschlagen, bei dem Sie zusätzliche ssh-Verbindungen verwenden, um jeweils ein weiteres Paar von Dateideskriptoren zu übertragen. Beispiel: Das folgende Proof-of-Concept-Skript führt zunächst einen Dummy-Befehl (sleep) aus, um die lokalen fds 5 und 6 mit dem fernen stdin und stdout zu verbinden. Vorausgesetzt, Sie möchten diese fds zu den üblichen 0,1-fds hinzufügen. 2.
Dann ist der eigentliche SSH fertig, und auf der Fernbedienung werden die fds 5 und 6 mit dem Standard und dem Standard des anderen SSH verbunden.
Nur als Beispiel übergibt dieses Skript eine gzippte Manpage an die Fernbedienung, die die Manpage entpackt und durchläuft. Der Standard und der Standard des echten SSH sind noch für andere Dinge verfügbar.
quelle
Das Problem mit der Antwort von @jakuje ist: Es funktioniert nur mit Sockets , aber Sie können keine Standard-UNIX-Tools verwenden, die Dateien mit ihnen erwarten :
ssh -R/tmp/sock.remote:/tmp/sock.local "$HOST" 'LANG=C cat >/tmp/sock.remote'
Außerdem besteht das Problem, dass die lokale Socket-Datei auf dem Remote-Host nicht gelöscht wird. Wenn Sie das nächste Mal denselben Befehl ausführen, wird eine Warnung angezeigt und der Socket wird nicht ordnungsgemäß neu erstellt. Sie können die Option
-o StreamLocalBindUnlink=yes
zumssh
Trennen dieser alten Socket geben, aber in meinen Tests war es nicht genug; Sie müssen Sie auch bearbeiten, umsshd_config
zu enthalten,StreamLocalBindUnlink=yes
damit diese Option funktioniert.Aber können Sie verwenden ,
socat
odernetcat
oder ein anderes ähnliches Werkzeug unterstützt UNIX lokale Steckdosen (netcat-traditional
ist nicht genug!) , Um die lokale Socket - Weiterleitung für die Dateiübertragung zu verwenden:Sie können auch interaktive Befehle ausführen. In diesem Fall sollten Sie
ssh -t
TTYs zuweisen.Das Problem bei dieser Lösung ist, dass Sie die Pfade der lokalen UNIX-Sockets fest codieren müssen: Lokal ist dies kein so großes Problem, wie Sie es
$$
in den Pfad aufnehmen können, um ihn pro Prozess oder Benutzer als temporäres Verzeichnis eindeutig zu machen, sondern auf der Remote-End verwenden Sie besser nicht das von der Welt beschreibbare Verzeichnis/tmp/
wie in meinem Beispiel. Das Verzeichnis muss auch bereits beimssh
Start der Sitzung vorhanden sein. Und die Socket-Inode bleibt auch nach dem Schließen der Sitzung erhalten. Wenn Sie also so etwas wie "$ HOME / .ssh. $$" verwenden, wird Ihr Verzeichnis im Lauf der Zeit mit toten Inodes überfüllt.Sie können auch TCP-Sockets verwenden, an
localhost
die Sie gebunden sind, um zu verhindern , dass Ihre Dateisysteme mit toten Inodes überfrachtet werden. Trotzdem müssen Sie immer noch Probleme haben, eine (eindeutige) nicht verwendete Portnummer zu wählen. Also immer noch nicht ideal. (ssh
Hat Code zum dynamischen Zuweisen von Ports, aber ich habe keine Möglichkeit gefunden, diese Informationen auf dem Remote-Host abzurufen.)Die wahrscheinlich einfachste Lösung zum Kopieren von Dateien besteht darin, die integrierte Verbindungsfreigabefunktion von ssh zu verwenden und einen
scp
odersfrp
-Befehl auszuführen, während Ihre interaktive Sitzung noch parallel ausgeführt wird. Siehe Eine Datei mit ssh zurück auf das lokale System kopieren .quelle