Wie verwalte ich Tunnel als Hintergrundprozesse von einem Shell-Skript aus?

18

Ich muss ein paar SSH-Tunnel aus einem Shell-Skript einrichten. Ich habe versucht, sie als BG-Aufgaben auszuführen:

#!/bin/sh
ssh -L 3000:server1:5029 me@server2 &
ssh -L 3001:server3:3306 me@server2 &

Aber die Tunnel scheinen nicht richtig zu funktionieren, wenn ich sie so starte.

Sie funktionieren einwandfrei, wenn ich sie manuell in ihren eigenen Registerkarten einrichte. Daher ist meine nächste Idee, das Skript neue Registerkarten in Terminal öffnen zu lassen und die Befehle dort als Vordergrundprozesse auszuführen.

Hinweis: Diese Frage lautete ursprünglich "Wie starte ich eine neue Terminalregisterkarte in der Shell und führe dann einen Befehl darin aus?", Aber ich erhielt zwei Antworten zum Umgang mit den Tunneln. Für die Frage "Öffnen einer Shell" habe ich dies bei SuperUser gefunden , was funktionieren wird, obwohl neue Registerkarten im Hintergrund den Vordergrundfenstern vorzuziehen wären, die es öffnet.

Sprugman
quelle
Führen Sie eine aktive SSH-Sitzung zum Server durch? Bedeutet das, haben Sie Ihre Tunnel im Hintergrund und eine SSH-Sitzung im Vordergrund, in der Sie tatsächlich arbeiten?
Jack M.
Bisher habe ich drei Registerkarten geöffnet: eine für jeden Tunnel und eine für was auch immer. Der Großteil meiner eigentlichen Arbeit findet in Eclipse und einem Browser statt.
Sprugman
(Die Tunnel sind nur, damit ich von meiner lokalen Tomcat-Instanz aus auf einige entfernte Datenbanken zugreifen kann.)
sprugman

Antworten:

25

Dies ist technisch gesehen keine Antwort auf die gestellte Frage, sondern eine Antwort auf Ihr Problem wie beschrieben. Der Befehl ssh verfügt über zwei Schalter, die für Sie nützlich sein können:

ssh -f -N -L 3000:server1:5029 me@server2

ssh wird angewiesen, sich nur so lange im Vordergrund aufzuhalten, bis er nach den erforderlichen Kennwörtern fragt. Anschließend wird er in den Hintergrund gestellt und führt keinen Remote-Befehl aus, sondern bearbeitet nur den Tunnel.

Wenn Sie wirklich möchten, dass dies in einer Registerkarte angezeigt wird, möchten Sie möglicherweise eine andere Lösung.

zzz
quelle
Ich habe Schlüssel eingerichtet, muss also keine Passwörter eingeben, aber das scheint zu funktionieren. Vielen Dank! Eine Frage: Wie kann ich auf die Tunnel zugreifen, um zu sehen, ob eine Zeitüberschreitung aufgetreten ist, oder um sie zu beenden usw.? Weder jobsnoch pslistet einen Griff zu ihnen ....
Sprugman
2
ps -wwajx | grep ssh sollte Ihnen die Prozesse zeigen, dann können Sie sie nach Belieben beenden.
zzz
2
Ich möchte hinzufügen, dass Sie, wenn Sie -fden Prozess &am Ende über weglassen und im Hintergrund anzeigen , die PID über $!als Handle abrufen können, um den Tunnelprozess später in Ihrem Skript abzubrechen.
bk138
6

Ich würde vorschlagen, einfach Ihre Tunnel in Ihre "one for whatever" -Verbindung zu integrieren. Sie können es einfach machen, indem Sie die entsprechenden Einträge zu Ihrer ~/.ssh/configDatei hinzufügen :

Host server2
    HostName 10.1.1.1
    User me
    LocalForward 3000 127.0.0.1:5029
    LocalForward 3001 127.0.0.1:3306

Sie können sich dann einfach anmelden, indem Sie Folgendes ausführen:

> ssh server2

Die Tunnel sollten hochfahren und funktionieren, sodass Sie eine einzige SSH-Instanz haben, in der Sie "was auch immer" tun können. Wenn Sie eine zweite Verbindung zu öffnen müssen server2, wird möglicherweise eine Fehlermeldung angezeigt:

> ssh server2
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3001
Could not request local forwarding.

Das tut nichts anderes als deinen Augen weh. Sie können diese Weiterleitungen auch für mehrere Server einrichten, indem Sie ähnliche Leitungen für andere Server hinzufügen. Dies geschieht automatisch.

Jack M.
quelle
Die Antwort von @ zzz scheint mehr oder weniger dasselbe zu tun und ist etwas direkter. Trotzdem danke.
Sprugman
In Kombination mit den Optionen -f -N ist dies eine hervorragende Möglichkeit, die Weiterleitung für mehrere Ports auf einmal einzurichten. Danke, Mann.
Narsk