Zakładając, że uruchomiłeś to polecenie: ssh -f [email protected] -L 3306:mysql-server.com:3306 -N
zgodnie z opisem w poście, do którego utworzyłeś łącze.
Podział polecenia:
ssh
: to dość oczywiste. Wywołuje ssh
.
-f
: (Ze man ssh
strony)
Żą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 ssh
w tło po wprowadzeniu jakichkolwiek haseł w celu nawiązania połączenia; zwraca do powłoki znak zachęty localhost
zamiast logowania się remote-host
.
[email protected]
: zdalny serwer, do którego chcesz się zalogować.
-L 3306:mysql-server.com:3306
: To jest interesująca część. -L
(ze man ssh
strony):
[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:3306
wiąż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.com
a następnie łączy się mysql-server.com
na porcie 3306
.
-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 ssh
proces, który otworzyłeś, przechodzi w tło. Sposób ładniejszy zamknięcia jest, aby uruchomić ps aux | grep 3306
, wybrać pid
z ssh -f ... -L 3306:mysql-server.com:3306 -N
i kill <pid>
. (A może kill -9 <pid>
; zapominam, czy po prostu kill
działa). Ma to piękną zaletę, że nie zabija wszystkich twoich innych ssh
połą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 [email protected] -L 33060:mysql-server.com:3306 -N
używałeś, wskazałbyś swoją funkcję connect-to-mysql Zend localhost
na port 33060
, który połączyłby się mysql-server.com
z portem 3306
. Oczywiście możesz nadal łączyć się localhost
przez port 3306
, więc nadal możesz korzystać z lokalnego mysql
serwera.
-9
nie jest potrzebnykill
, biorąc pod uwagę, że proces nadal działa dobrze ;-)To zabije wszystkie sesje ssh, które otworzyłeś z terminala.
źródło
killall ssh
to raczej lekkomyślna komenda. Radzę przeszukać listę procesów (tjps aux | grep ssh
. Zgodnie z sugestią @simont powyżej), aby odkryć konkretny identyfikator procesu twojego tunelu ssh. Wtedy możesz konkretnie zabić pid.Uwaga: dodanie jako odpowiedź, ponieważ komentarze nie obsługują bloków kodu.
Moim zdaniem lepiej NIE używać,
-f
a 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
źródło
-f
umożliwiassh
kontynuowanie sesji nawet po zamknięciu sesji terminala, w przeciwieństwie do wypychania w tle. Chwytanie zapid
używanieps aux | grep ssh | grep <LOCAL-PORT>
jest dość trywialne.-f
ma 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ącfg
).