Jak zarządzać tunelami jako procesami w tle ze skryptu powłoki?

14

Muszę skonfigurować kilka tuneli ssh ze skryptu powłoki. Próbowałem uruchomić je jako zadania bg, używając:

#!/bin/sh
ssh -L 3000:server1:5029 me@server2 &
ssh -L 3001:server3:3306 me@server2 &

ale tunele nie działają poprawnie, gdy uruchamiam je w ten sposób.

Działają dobrze, gdy ręcznie ustawiam je na własnych kartach, więc moim następnym pomysłem jest, aby skrypt otworzył nowe karty w Terminalu i uruchomił tam polecenia jako procesy na pierwszym planie.

Uwaga: to pytanie było pierwotnie „Jak uruchomić nową kartę terminala z powłoki, a następnie uruchomić w niej polecenie?”, ale mam dwie odpowiedzi na temat radzenia sobie z tunelami. Dla pytania „otwieranie powłoki” znalazłem to na SuperUser , która będzie działać, chociaż nowe karty w tle byłyby lepsze niż okna pierwszego planu, które otwiera.

sprugman
źródło
Czy prowadzisz aktywną sesję SSH na serwerze? Czy masz tunele w tle i sesję SSH na pierwszym planie, w której faktycznie pracujesz?
Jack M.
Do tej pory trzymałem trzy otwarte karty: jedną dla każdego tunelu i drugą dla każdego. Większość mojej aktualnej pracy odbywa się w Eclipse i przeglądarce.
sprugman
(Tunele są tylko takie, że mogę uzyskać dostęp do niektórych zdalnych dbs z mojej lokalnej instancji Tomcat).
sprugman

Odpowiedzi:

21

Nie jest to technicznie odpowiedź na zadane pytanie, ale raczej odpowiedź na opisany problem. Komenda ssh ma dwa przełączniki, które mogą być przydatne:

ssh -f -N -L 3000:server1:5029 me@server2

nakazuje ssh trzymać się na pierwszym planie wystarczająco długo, aby poprosić o niezbędne hasła, a następnie umieścić się w tle, nie wykonując żadnego polecenia zdalnego, ale po prostu obsługując tunel.

Jeśli naprawdę chcesz, aby pojawiło się to na karcie, możesz chcieć innego rozwiązania.

zzz
źródło
Ustawiam klucze, więc nie muszę wprowadzać haseł, ale to działa. Dzięki! Jedno pytanie: jak uzyskać dostęp do tuneli, aby sprawdzić, czy upłynęły limity czasu, czy je zakończyć itp.? Ani jobs ani ps wymienia uchwyt do nich ....
sprugman
2
ps -wwajx | grep ssh powinien pokazać ci procesy, a następnie możesz je zabić, jak ci się podoba.
zzz
1
Chciałbym to dodać, jeśli pominiesz -f i tło procesu za pośrednictwem & na końcu możesz uzyskać PID przez $! jako uchwyt do zabicia procesu tunelowego później w skrypcie.
bk138
6

Sugerowałbym po prostu zintegrowanie tuneli z twoim połączeniem „jedno na wszystko”. Możesz to ułatwić, dodając odpowiednie wpisy do swojego ~/.ssh/config plik:

Host server2
    HostName 10.1.1.1
    User me
    LocalForward 3000 127.0.0.1:5029
    LocalForward 3001 127.0.0.1:3306

Następnie możesz po prostu zalogować się, uruchamiając:

> ssh server2

Tunele powinny się pojawić i zacząć działać, pozostawiając pojedynczą instancję SSH, w której można wykonać „cokolwiek”. Jeśli chcesz otworzyć drugie połączenie z server2, może pojawić się błąd:

> ssh server2
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3001
Could not request local forwarding.

To nie boli niczego poza twoimi oczami. Możesz również skonfigurować te przekazy dla wielu serwerów, dodając podobne linie dla innych serwerów i wszystko to stanie się automatycznie.

Jack M.
źródło
Odpowiedź @ zzz wydaje się robić to samo, mniej więcej, i jest nieco prostsza. W każdym razie dzięki.
sprugman
To, w połączeniu z opcjami -f -N, to doskonały sposób na skonfigurowanie przekazywania wielu portów za jednym razem. Dzięki.
narsk