Czasami ponownie uruchamiam urządzenie i muszę się z ssh
powrotem podłączyć, gdy będzie gotowe.
Chcę uruchamiać polecenie ssh co 5 sekund, aż polecenie się powiedzie.
Moja pierwsza próba:
watch -n5 ssh [email protected] && exit 1
W jaki sposób mogę to zrobić?
Odpowiedzi:
Inną opcją byłoby użycie
until
.Jeśli robisz to wielokrotnie dla wielu hostów, umieść to w swojej funkcji
~/.bashrc
.źródło
$
zamiast monitu :-)ssh
można wyjść ze statusem niezerowym po udanym połączeniu, jeśli sesja zakończy się czymś zewnętrznym, w którym to przypadku skrypt podejmie próbę ponownego połączenia. Może to być pożądany efekt uboczny.!!
Powtórzyć ostatnie polecenie.źródło
OpenSSH ma
ConnectionAttempts
ustawienie, które robi prawie to, co chcesz. Wartość domyślna to 1, ale można ją zmienić wssh_config
wierszu polecenia lub w wierszu poleceń:Niestety nie można dostosować interwału próby, który jest ustalony na 1 sekundę, ale można dostosować limit czasu próby połączenia
ConnectTimeout
(w sekundach) w ten sam sposób.źródło
źródło
while ! nc -w5 -z host.example.com 22; do [...]
.autossh
utrzymuje sesje ssh przy życiu. Przy odpowiednich parametrach możesz go również uruchomić, gdy połączenie jest obecnie niemożliwe i będzie próbował, dopóki się nie powiedzie. Działa to dobrze, ale jeśli chcesz, aby część re Connect działała dobrze z interaktywnymi sesjami, musisz połączyć ją zscreen
lub równoważną.Polecam to:
Ale zobacz jego stronę podręcznika, aby uzyskać szczegółowe informacje. Przy powyższych parametrach
autossh
spróbuje uruchomić ssh coAUTOSSH_POLL
sekundę,AUTOSSH_GATETIME=0
sprawi, że spróbuje ponownie, jeśli pierwsza próba się nie powiedzie (więc na pewno to, czego chcesz),-M 0
wyłącza sprawdzanie połączenia przez autossh, wszystkie późniejsze opcje są przekazywane do ssh. Obie-o
opcje powodują wyjście ssh, jeśli połączenia spadną na więcej niż 5 sekund.źródło
Ryzykując po prostu rzuceniem kodu na odpowiedź, ten skrypt działa dla mnie codziennie. Nazywam to
ressh
i można go używać tak prostoressh {hostname}
lub ostrożnie,ressh -S {session_name} {hostname}
źródło