it-swarm.com.de

Bash-Skript zum Einrichten eines temporären SSH-Tunnels

Unter Cygwin möchte ich ein Bash-Skript:

  1. Erstellen Sie einen SSH-Tunnel zu einem Remote-Server.
  2. Führen Sie einige Arbeiten lokal aus, die den Tunnel verwenden.
  3. Dann schalte den Tunnel aus.

Das Herunterfahren hat mich verwirrt.

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 [email protected]

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 beenden.

Ich möchte das alles in einem Skript machen, wie:

# Create tunnel
# Do work
# Kill tunnel

Wie verfolge ich den Tunnelprozess, damit ich weiß, welchen ich töten soll?

122
jm.

Sie können dies sauber mit einer SSH-Steuerbuchse tun. Um mit einem bereits laufenden SSH-Prozess zu sprechen und dessen PID abzurufen, beenden Sie ihn usw. Verwenden Sie den 'Kontrollsocket' (-M für Master und -S für Socket) wie folgt:

$ ssh -M -S my-ctrl-socket -fnNT -L 50000:localhost:3306 [email protected]
$ ssh -S my-ctrl-socket -O check [email protected]
Master running (pid=3517) 
$ ssh -S my-ctrl-socket -O exit [email protected]
Exit request sent. 

Beachten Sie, dass my-ctrl-socket eine tatsächliche Datei ist, die erstellt wird.

Ich habe diese Information von eine sehr RTFM Antwort auf die OpenSSH-Mailingliste .

301
Chris McCormick

Sie können SSH mit der Option -f anweisen, sich im Hintergrund zu bewegen, aber mit $! Erhalten Sie die PID nicht. Außerdem können Sie mit -o ExitOnForwardFailure = yes festlegen, dass Ihr Skript nicht beliebig lange ruht, bevor Sie den Tunnel verwenden. Mit -f wartet SSH, bis alle Remote-Port-Weiterleitungen erfolgreich hergestellt wurden, bevor es sich in den Hintergrund stellt. Sie können die Ausgabe von ps abrufen, um die PID zu erhalten. Zum Beispiel können Sie verwenden

...
ssh -Cfo ExitOnForwardFailure=yes -NL 9999:localhost:5900 $REMOTE_Host
PID=$(pgrep -f 'NL 9999:')
[ "$PID" ] || exit 1
...

und seien Sie sich ziemlich sicher, dass Sie die gewünschte PID erhalten

19
Maine Guy
  • Sie können ssh anweisen, mit & in den Hintergrund zu treten und keine Shell auf der anderen Seite (öffnen Sie einfach den Tunnel) mit einem Befehlszeilenflag zu erstellen (ich sehe, dass Sie dies bereits mit -N getan haben).
  • Speichern Sie die PID mit PID=$!
  • Mach deine Sachen
  • kill $PID

BEARBEITEN: Fixed $? zu $! und fügte hinzu, die &

18
ZeissS

Ich bevorzuge es, eine neue Shell für separate Aufgaben zu starten, und verwende häufig die folgende Befehlskombination:

  $ Sudo bash; exit

oder manchmal:

  $ : > sensitive-temporary-data.txt; bash; rm -f sensitive-temporary-data.txt; exit

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 bereinigt und beendet sich ebenfalls. Sie könnten leicht werfen bash; in Ihr SSH-Tunnelskript direkt vor dem Teil kill, sodass Ihr Tunnel geschlossen wird, wenn Sie sich von der verschachtelten Shell abmelden:

#!/bin/bash
ssh -nNT ... &
PID=$!
bash
kill $PID
4
too much php

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

2
Phil Pelanne

Sie können das ssh mit einem & a das Ende, um es in den Hintergrund zu stellen und seine ID zu erhalten, wenn Sie dies tun. Dann müssen Sie nur noch ein kill dieser ID machen, wenn Sie fertig sind.

2
Valentin Rocher