Jak zamknąć ten tunel ssh? [Zamknięte]


101

Otworzyłem tunel ssh zgodnie z opisem w tym poście: Zend_Db: Jak połączyć się z bazą danych MySQL przez tunel SSH?

Ale teraz nie wiem, co właściwie zrobiłem. Czy to polecenie ma wpływ na cokolwiek na serwerze? A jak zamknąć ten tunel, bo teraz nie mogę poprawnie używać mojego lokalnego mysql.

Używam OSX Lion, a serwer działa na Ubuntu 11.10.

Odpowiedzi:


243

Zakładając, że uruchomiłeś to polecenie: ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -Nzgodnie z opisem w poście, do którego utworzyłeś łącze.

Podział polecenia:

  1. ssh: to dość oczywiste. Wywołuje ssh.
  2. -f: (Ze man sshstrony)

    Żąda ssh, aby przejść do tła tuż przed wykonaniem polecenia. Jest to przydatne, jeśli ssh będzie prosić o hasła lub hasła, ale użytkownik chce, aby było to w tle.

    Zasadniczo wysyłaj sshw tło po wprowadzeniu jakichkolwiek haseł w celu nawiązania połączenia; zwraca do powłoki znak zachęty localhostzamiast logowania się remote-host.

  3. user@mysql-server.com: zdalny serwer, do którego chcesz się zalogować.
  4. -L 3306:mysql-server.com:3306: To jest interesująca część. -L(ze man sshstrony):

    [adres_wiązania:] port: host: port_hosta Określa, że ​​podany port na hoście lokalnym (klienta) ma być przekierowany do podanego hosta i port po stronie zdalnej.

    Więc -L 3306:mysql-server.com:3306wiąże port lokalny3306 ze zdalnym portem 3306 na hoście mysql-server.com.

    Po podłączeniu do portu lokalnego3306 połączenie jest przekazywane przez bezpieczny kanał do mysql-server.com. Zdalnego hosta , mysql-server.coma następnie łączy się mysql-server.comna porcie 3306.

  5. -N: nie wykonuj polecenia. Jest to przydatne do „zwykłego przekazywania portów” (cytując stronę podręcznika).

Czy to polecenie ma wpływ na cokolwiek na serwerze?

Tak, ustanawia połączenie między hostem lokalnym a mysql-server.com na porcie 3306 .

A jak mam zamknąć ten tunel ...

Jeśli użyłeś -f, zauważysz, że sshproces, który otworzyłeś, przechodzi w tło. Sposób ładniejszy zamknięcia jest, aby uruchomić ps aux | grep 3306, wybrać pidz ssh -f ... -L 3306:mysql-server.com:3306 -Ni kill <pid>. (A może kill -9 <pid>; zapominam, czy po prostu killdziała). Ma to piękną zaletę, że nie zabija wszystkich twoich innych sshpołączeń; jeśli masz więcej niż jeden, przywrócenie ich może być lekkim ... bólem.

... ponieważ teraz nie mogę poprawnie używać mojego lokalnego mysql.

Dzieje się tak, ponieważ skutecznie „przechwyciłeś” proces lokalny mysql i przekierowałeś cały ruch, który próbuje się z nim połączyć, do procesu zdalnego mysql . O wiele lepszym rozwiązaniem byłoby nieużywanie portu lokalnego 3306 w przekazywaniu portu. Użyj czegoś, co nie jest używane, na przykład 33060. (Wyższe liczby są zwykle rzadziej używane; często przenosi się do przodu kombinację, taką jak ta: „2525-> 25”, „8080-> 80”, „33060-> 3306” lub podobnie. Ułatwia nieco zapamiętywanie).

Tak więc, jeśli ssh -f user@mysql-server.com -L 33060:mysql-server.com:3306 -Nużywałeś, wskazałbyś swoją funkcję connect-to-mysql Zend localhostna port 33060, który połączyłby się mysql-server.comz portem 3306. Oczywiście możesz nadal łączyć się localhostprzez port 3306, więc nadal możesz korzystać z lokalnego mysqlserwera.


5
Najlepsze wyjaśnienie, które przeczytałem za chwilę. Jest to bardzo przydatne podczas uzyskiwania dostępu do zdalnej bazy danych z lokalnie zainstalowanych środowisk, takich jak na przykład R. Działa dobrze z uwierzytelnianiem za pomocą klucza publicznego / prywatnego. Nie z hasłami, ponieważ nie znalazłem sposobu na hasło.
Matt Bannert,

Zaakceptowanie tej odpowiedzi jako najlepszej ze względu na dokładne wyjaśnienie.
Jacob

Niezła odpowiedź! Nawiasem mówiąc, -9nie jest potrzebny kill, biorąc pod uwagę, że proces nadal działa dobrze ;-)
Lucio Paiva

47

To zabije wszystkie sesje ssh, które otworzyłeś z terminala.

sudo killall ssh

„Nie znaleziono pasujących procesów” - czytamy.
Jacob,

Na to wygląda. MySQL również działał dobrze, ale Apache zaczął narzekać. Zrestartowałem komputer i wszystko działa zgodnie z oczekiwaniami. Chyba problem rozwiązany :)
Jacob

5
Cóż, nie chcesz tego robić, jeśli jest to środowisko prod ...
wyrzucisz

12
Bieganie killall sshto raczej lekkomyślna komenda. Radzę przeszukać listę procesów (tj ps aux | grep ssh. Zgodnie z sugestią @simont powyżej), aby odkryć konkretny identyfikator procesu twojego tunelu ssh. Wtedy możesz konkretnie zabić pid.
Ben

Jest duża szansa, że ​​nie będziesz chciał ich wszystkich zabić.
wobbily_col

23

Uwaga: dodanie jako odpowiedź, ponieważ komentarze nie obsługują bloków kodu.

Moim zdaniem lepiej NIE używać, -fa zamiast tego po prostu wykonać normalny proces w tle &. To da ci dokładny pid, który musisz zabić:

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

Albo jeszcze lepiej, po prostu utwórz to jako skrypt opakowujący:

# 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
Użycie -fumożliwia sshkontynuowanie sesji nawet po zamknięciu sesji terminala, w przeciwieństwie do wypychania w tle. Chwytanie za pidużywanie ps aux | grep ssh | grep <LOCAL-PORT>jest dość trywialne.
simont

1
@simont, używając jawnego numeru pid zwróconego z zadania w tle, jest bezpieczniejsze, niezależnie od tego, w jaki sposób je wykonujesz. jeśli masz uruchomionych więcej niż jeden proces ssh , będziesz miał zły czas
aaron

Używanie -fma również tę zaletę, że w razie potrzeby prosi użytkownika lokalnego o hasło logowania. Jeśli używasz &, ten monit nie jest widoczny dla użytkownika, chyba że przeniesie proces na pierwszy plan (np. Używając fg).
Bdoserror


4
gdy pierwszy raz <LOCAL-PORT> pojawia się w pid procesu, który również zawiera tekst „ssh” (np. inny proces ssh lub sshd lub edycja pliku z „ssh” w nazwie), zdasz sobie sprawę, że to podejście, choć wygodne w prostych scenariuszach, nie jest kuloodporne
aaron
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.