Powiązane pytanie: zainicjuj połączenie ssh z serwera do klienta
Odpowiedzi stamtąd bardzo mi pomogły, to polecenie robi to, czego potrzebuję:
ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
Napisałem więc skrypt, aby cały czas łączyć się ponownie:
#!/bin/bash
while true; do
echo "try to connect..."
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
echo "restarting in 5 seconds.."
sleep 5
done
I dodał to do /etc/crontab
. Ale dowiedziałem się, że działa, jeśli wykonam go „ręcznie” z powłoki, ale jeśli zostanie wywołany przez crona, ssh łączy się i natychmiast kończy. (więc powyższy skrypt ciągle się łączy)
Z man ssh
, odkryłem, że w przypadku połączeń w tle powinienem wywoływać to -n
kluczem, ale to nie pomogło. Potem rozejrzałem się za podobnymi skryptami i odkryłem, że działa, jeśli wywołam tail -f something
, tj. Jakieś polecenie „niekończącego się”, więc właśnie utworzyłem pusty plik, /tmp/dummy_file
a teraz moje polecenie ssh wygląda następująco:
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
Teraz działa! Ale to rozwiązanie wydaje się trochę brzydkie, a ponadto nie rozumiem faktycznych przyczyn takiego zachowania. Przez przypadek próbowałem zadzwonić bash
zamiast tail -f
( bash
wydaje mi się to również „niekończącym się” poleceniem), ale to nie działa.
Czy ktoś mógłby wyjaśnić to zachowanie i jaki jest prawidłowy sposób utworzenia połączenia ssh w tle, aby utrzymać tunel ssh odwrotny?
źródło
&
na końcu polecenia ssh:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
while
pętla będzie się uruchamiała od nowa, rozpoczynając nowessh
połączenie w tle co 5 sekund, prawda? Nie tego potrzebuję.Odpowiedzi:
Wygląda na to, że chcesz mieć
-N
opcję ssh.źródło
Zdecydowanie sugeruję rozważenie
autossh
. Ma pewną heurystykę, która pozwoli mu ustalić, czy przyczyną utraty połączenia jest podstawowa przyczyna i obniży częstotliwość prób ponownego połączenia. Ponadto monitoruje połączenie za pomocą dodatkowych tuneli, co czyni go bardzo przydatnym w scenariuszach takich jak ten, o który pytasz.Na przykład w systemie Ubuntu możesz wyszukać w Internecie,
autossh upstart
aby znaleźć przydatne przykłady konfiguracji Ubuntu, aby tunel był utrzymywany w sposób trwały.Używam tego, aby utrzymać tunelowane połączenie otwarte dla mojego serwera przez cały czas dla niektórych usług.
źródło
autossh
, przeczytałem ten artykuł: goo.gl/jVuuSR , ale zadziałało to tylko wtedy, gdy mam połączenie internetowe od razu po uruchomieniu systemu; ale jeśli połączenie zostanie nawiązane później, nie zadziała. Nie jestem pewien, może zrobiłem coś źle, ale nawet w tym artykule autor masleep 10
w jego/etc/rc.local
, aby mieć pewność, internet jest już gotowy, kiedy autossh nazywa.upstart
i innych wymian init możesz powiązać początek tunelu z jednym lub więcej podłączonymi urządzeniami sieciowymi. Najlepsze z rozwiązań (IMO) w Internecie to: erik.torgesta.com/tag/ssh-upstart ... isleep 10
w niektórych przypadkach i tak nie pomoże.ssh-upstart
, popatrzę na to!Po drugie poproszę @ 0xC0000022L sugestię i skorzystam z niej
autossh
. Używam go do utrzymywania połączenia SSH z mojego laptopa, ponieważ zabieram go z miejsca na miejsce i to po prostu działa. Używam tego połączenia do tunelowania tylnych portów 25 i 2143 w celu uzyskania dostępu do moich osobistych serwerów SMTP i IMAP.Oto skrypt, którego używam:
Następnie utrzymuję
Host
wpis w moim$HOME/.ssh/config
pliku dla hostaimap-o
.autossh_mail.sh
Skrypt jest uruchamiany jako część mojego pulpitu po zalogowaniu się. Można do niego dostęp za pośrednictwemgnome-session-properties
.źródło