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?
while
pętla będzie się uruchamiała od nowa, rozpoczynając nowe ssh
połączenie w tle co 5 sekund, prawda? Nie tego potrzebuję.
&
na końcu polecenia ssh:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &