Wie schließe ich diesen SSH-Tunnel? [geschlossen]


94

Ich habe einen SSH-Tunnel wie in diesem Beitrag beschrieben geöffnet: Zend_Db: Wie kann ich über einen SSH-Tunnel eine Verbindung zu einer MySQL-Datenbank herstellen?

Aber jetzt weiß ich nicht, was ich tatsächlich getan habe. Hat dieser Befehl Auswirkungen auf den Server? Und wie schließe ich diesen Tunnel, weil ich mein lokales MySQL jetzt nicht richtig verwenden kann.

Ich benutze OSX Lion und der Server läuft unter Ubuntu 11.10.

Antworten:


239

Angenommen, Sie haben diesen Befehl ausgeführt: ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -Nwie in dem von Ihnen verlinkten Beitrag beschrieben.

Eine Aufschlüsselung des Befehls:

  1. ssh: das ist ziemlich selbsterklärend. Ruft auf ssh.
  2. -f: (Von der man sshSeite)

    Fordert ssh auf, kurz vor der Befehlsausführung in den Hintergrund zu gehen. Dies ist nützlich, wenn ssh nach Passwörtern oder Passphrasen fragen soll, der Benutzer dies jedoch im Hintergrund wünscht.

    Senden sshSie im Wesentlichen an den Hintergrund, sobald Sie Kennwörter eingegeben haben, um die Verbindung herzustellen. Es gibt Ihnen die Shell-Eingabeaufforderung zurück, localhostanstatt Sie anzumelden remote-host.

  3. user@mysql-server.com: Der Remote-Server, bei dem Sie sich anmelden möchten.
  4. -L 3306:mysql-server.com:3306: Das ist das Interessante. -L(von der man sshSeite):

    [bind_address:] port: host: hostport Gibt an, dass der angegebene Port auf dem lokalen (Client-) Host an den angegebenen Host und Port auf der Remote-Seite weitergeleitet werden soll.

    So -L 3306:mysql-server.com:3306bindet den lokalen Port 3306an den Remote - Port 3306 auf dem Host mysql-server.com.

    Wenn Sie eine Verbindung zum lokalen Port herstellen 3306, wird die Verbindung über den sicheren Kanal an weitergeleitet mysql-server.com. Der Remote-Host stellt mysql-server.comdann eine Verbindung zu einem mysql-server.comPort her 3306.

  5. -N: Führen Sie keinen Befehl aus. Dies ist nützlich, um "nur Ports weiterzuleiten" (unter Angabe der Manpage).

Hat dieser Befehl Auswirkungen auf den Server?

Ja, es wird eine Verbindung zwischen localhost und mysql-server.com auf Port 3306 hergestellt .

Und wie schließe ich diesen Tunnel ...

Wenn Sie verwendet haben -f, werden Sie feststellen, dass der von sshIhnen geöffnete Prozess in den Hintergrund tritt. Die schönere Methode zum Schließen ist das Ausführen ps aux | grep 3306, Finden piddes ssh -f ... -L 3306:mysql-server.com:3306 -Nund kill <pid>. (Oder vielleicht kill -9 <pid>; ich vergesse, ob es nur killfunktioniert). Das hat den schönen Vorteil, dass Sie nicht alle anderen sshVerbindungen beenden. Wenn Sie mehr als eine haben, kann die Wiederherstellung dieser ein leichter ... Schmerz sein.

... weil ich mein lokales MySQL jetzt nicht richtig verwenden kann.

Dies liegt daran, dass Sie den lokalen mysql Prozess effektiv "erfasst" und den gesamten Datenverkehr, der versucht, eine Verbindung zu ihm herzustellen, an den Remote- mysql Prozess weitergeleitet haben. Eine viel schönere Lösung wäre, den lokalen Port 3306 nicht in der Portweiterleitung zu verwenden. Verwenden Sie etwas, das nicht verwendet wird, wie 33060. (Höhere Zahlen werden im Allgemeinen weniger verwendet; es ist ziemlich üblich, eine Kombination wie diese weiterzuleiten: "2525-> 25", "8080-> 80", "33060-> 3306" oder ähnlich. Erleichtert das Erinnern etwas).

Wenn Sie also verwenden ssh -f user@mysql-server.com -L 33060:mysql-server.com:3306 -N, verweisen Sie Ihre Zend-Funktion zum Verbinden mit MySQL localhostauf den Port 33060, der eine Verbindung zum mysql-server.comPort herstellen würde 3306. Sie können natürlich immer noch eine Verbindung zu einem localhostPort herstellen 3306, sodass Sie weiterhin den lokalen mysqlServer verwenden können.


4
Beste Erklärung, die ich seit einiger Zeit gelesen habe. Dies ist sehr nützlich, wenn Sie von lokal installierten Umgebungen wie beispielsweise R auf eine entfernte Datenbank zugreifen. Funktioniert gut mit der Authentifizierung mit öffentlichen / privaten Schlüsseln. Nicht mit Passwörtern, da ich keine Möglichkeit gefunden habe, die Passwörter weiterzugeben.
Matt Bannert

Akzeptieren Sie diese Antwort aufgrund der gründlichen Erklärung als am besten.
Jacob

Gute Antwort! Wird übrigens -9nicht benötigt kill, da der Prozess noch gut funktioniert ;-)
Lucio Paiva

46

Dadurch werden alle SSH-Sitzungen beendet, die Sie vom Terminal aus geöffnet haben.

sudo killall ssh

"Es wurden keine Übereinstimmungsprozesse gefunden", heißt es.
Jacob

Es scheint so zu sein. MySQL funktionierte ebenfalls gut, aber dann begann sich Apache zu beschweren. Ich habe einen Neustart durchgeführt und alles funktioniert wie erwartet. Problem behoben, denke ich :)
Jacob

5
Nun, Sie wollen dies nicht tun, wenn es sich um eine Produktumgebung handelt ... Sie werden alle anderen
Administratoren rausschmeißen

12
Laufen killall sshist ein ziemlich rücksichtsloser Befehl. Ich empfehle, Ihre Prozessliste zu durchsuchen (dh ps aux | grep sshwie oben von @simont vorgeschlagen), um die spezifische Prozess-ID Ihres SSH-Tunnelprozesses zu ermitteln. Dann können Sie pid das speziell töten.
Ben

Es besteht eine gute Chance, dass Sie nicht wollen, dass alle getötet werden.
Wobbily_col

20

Hinweis: Hinzufügen als Antwort, da Kommentare keine Codeblöcke unterstützen.

Meiner Meinung nach ist es besser, -fden Prozess NICHT wie gewohnt zu verwenden und stattdessen einfach als Hintergrund zu verwenden &. Das gibt dir genau die PID, die du zum Töten brauchst:

ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
... do yer stuff... launch mysql workbench whatever
echo "killing ssh tunnel $pid"
kill $pid

Oder noch besser, erstellen Sie dies einfach als Wrapper-Skript:

# backend-tunnel <your cmd line, possibly 'bash'>
ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
"$@"
echo "killing ssh tunnel $pid"
kill $pid

backend-tunnel mysql-workbench

backend-tunnel bash


12
Mit "Verwenden" -fkann die sshSitzung auch dann fortgesetzt werden, wenn die Terminalsitzung geschlossen ist, im Gegensatz zum Verschieben in den Hintergrund. Das pidVerwenden ps aux | grep ssh | grep <LOCAL-PORT>ist ziemlich trivial.
Simont

1
@simont die Verwendung der vom Hintergrundjob zurückgegebenen expliziten PID ist sicherer, unabhängig davon, wie Sie den Hintergrund erstellen. Wenn mehr als ein SSH-Prozess ausgeführt wird, werden Sie eine schlechte Zeit haben
Aaron

Die Verwendung -fhat auch den Vorteil, dass der lokale Benutzer bei Bedarf zur Eingabe des Anmeldekennworts aufgefordert wird. Wenn Sie verwenden &, wird diese Eingabeaufforderung vom Benutzer nur angezeigt, wenn er den Prozess in den Vordergrund stellt (z fg. B. mithilfe von ).
Bdoserror


3
Wenn Ihr <LOCAL-PORT> zum ersten Mal in der PID eines Prozesses auftritt, der auch den Text 'ssh' enthält (z. B. ein anderer ssh- oder sshd-Prozess oder das Bearbeiten einer Datei mit dem Namen 'ssh'), werden Sie feststellen, dass dies der Fall ist Ansatz, obwohl in einfachen Szenarien bequem, ist nicht kugelsicher
Aaron
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.