Auf Cygwin möchte ich, dass ein Bash-Skript:
- Erstellen Sie einen SSH-Tunnel zu einem Remote-Server.
- Arbeiten Sie lokal mit dem Tunnel.
- Dann den Tunnel schließen.
Der Shutdown-Teil hat mich ratlos gemacht.
Derzeit habe ich eine lahme Lösung. In einer Shell führe ich Folgendes aus, um einen Tunnel zu erstellen:
# Create the tunnel - this works! It runs forever, until the shell is quit.
ssh -nNT -L 50000:localhost:3306 jm@sampledomain.com
Dann mache ich in einem anderen Shell-Fenster meine Arbeit:
# Do some MySQL stuff over local port 50000 (which goes to remote port 3306)
Wenn ich fertig bin, schließe ich das erste Shell-Fenster, um den Tunnel zu töten.
Ich möchte dies alles in einem Skript tun, wie:
# Create tunnel
# Do work
# Kill tunnel
Wie verfolge ich den Tunnelprozess, damit ich weiß, welchen ich töten soll?
Antworten:
Sie können dies sauber mit einem ssh 'Control Socket' tun. Um mit einem bereits laufenden SSH-Prozess zu sprechen und dessen PID zu erhalten, ihn zu beenden usw. Verwenden Sie den 'Control Socket' (-M für Master und -S für Socket) wie folgt:
Beachten Sie, dass my-ctrl-socket eine tatsächliche Datei ist, die erstellt wird.
Ich habe diese Informationen von einer sehr RTFM-Antwort auf der OpenSSH-Mailingliste erhalten .
quelle
Operation not permitted
auf drone.io kontinuierliche Integrationsumgebung:muxserver_listen: link mux listener ssh-ctrl-socket.wsASkszgSBlK7kqD => ssh-ctrl-socket: Operation not permitted
my-ctrl-socket
Datei, nachdem diese ausgeführt wurde? Wenn ich esls -la
im aktuellen Ordner mache, kann ich die Datei nicht mehr sehen.while [ ! -e $ctrl_socket ]; do sleep 0.1; done
open failed: administratively prohibited: open failed
und ich glaube nicht, dass es den Tunnel öffnetSie können SSH mit der Option -f anweisen, sich selbst in den Hintergrund zu stellen, aber Sie erhalten die PID nicht mit $!. Anstatt Ihr Skript eine beliebige Zeitspanne ruhen zu lassen, bevor Sie den Tunnel verwenden, können Sie -o ExitOnForwardFailure = yes mit -f verwenden. SSH wartet, bis alle Remote-Port-Weiterleitungen erfolgreich eingerichtet wurden, bevor Sie sich in den Hintergrund stellen. Sie können die Ausgabe von ps abrufen, um die PID zu erhalten. Zum Beispiel können Sie verwenden
und seien Sie ziemlich sicher, dass Sie die gewünschte PID erhalten
quelle
ssh
, dass Sie&
mit einem Befehlszeilenflag in den Hintergrund gehen und keine Shell auf der anderen Seite erstellen (öffnen Sie einfach den Tunnel) (ich sehe, dass Sie dies bereits getan haben-N
).PID=$!
kill $PID
EDIT: $ behoben? zu $! und fügte das & hinzu
quelle
trap 'kill $PID' 1 2 15
deckt viele Fälle von Skriptfehlern ab.trap "kill $PID"
, weil Bash nur Variablen in doppelt zitierten Zeichenfolgen interpoliertPID
Variable später neu definiert würde. Die Variable wird entweder erweitert, wenn dietrap
integrierte Funktion aufgerufen wird (Ansatz des OP) oder wenn ein Signal abgefangen wurde (Ihr Ansatz). Beide Ansätze führen hier zum gleichen Ergebnis.Ich starte lieber eine neue Shell für separate Aufgaben und verwende häufig die folgende Befehlskombination:
oder manchmal:
Diese Befehle erstellen eine verschachtelte Shell, in der ich meine gesamte Arbeit erledigen kann. Wenn ich fertig bin, drücke ich STRG-D und die übergeordnete Shell wird aufgeräumt und auch beendet. Sie können leicht
bash;
in Ihr SSH-Tunnelskript direkt vor demkill
Teil werfen, sodass Ihr Tunnel geschlossen wird, wenn Sie sich von der verschachtelten Shell abmelden:quelle
Sie können das
ssh
mit einem&
Ende starten , um es in den Hintergrund zu stellen und dabei seine ID abzurufen. Dann müssen Sie nur noch einekill
dieser IDs erstellen, wenn Sie fertig sind.quelle
Eine weitere mögliche Option: Wenn Sie das Expect-Paket installieren können, sollten Sie in der Lage sein, das Ganze zu skripten. Einige gute Beispiele hier: http://en.wikipedia.org/wiki/Expect
quelle