Automatyczne ponowne łączenie połączeń SSH z określoną sesją „screen”

10

Zwykle mam kilka okien terminali, z których każde jest połączone za pomocą ssh ze zdalnym serwerem. W każdym oknie pracuję za pomocą programu ekranowego GNU, aby zapewnić trwałość procesów interaktywnych w przypadku rozłączenia.

Obecnie za każdym razem, gdy połączenie ssh zostaje zerwane (na przykład gdy uśpiam komputer kliencki w nocy), muszę ręcznie i żmudnie ponownie uruchamiać sesję ssh w każdym oknie, a następnie w każdym oknie żmudnie wznawiać określoną sesję ekranu (np. „Screen - r 3453 „w jednym oknie”, „screen -r 3462” w drugim itd.)

Czy istnieje elegancki sposób na zautomatyzowanie tego? Konkretnie:

  • ponownie połącz sesję ssh, jeśli spadnie, gdy tylko zostanie wykryte połączenie internetowe

  • uruchom konkretną instancję ekranu dla okna terminala, gdy tylko ssh ponownie się połączy

Dzięki za wszelkie wskazówki na ten temat

GJ
źródło

Odpowiedzi:

10

Możesz uruchomić to: ssh -t hostname screen -r 3453aby ponownie połączyć. Jeśli chcesz to zrobić w pętli, używam następującego skryptu.

while true; do
    ssh -t -o BatchMode=yes eeepc-rsi "screen -r 3453"
    sleep 2
done

Działa to najlepiej, jeśli masz skonfigurowane klucze ssh, dzięki czemu możesz się zalogować bez wpisywania hasła. Polecam również przyjrzeć się Tmuxowi, nowocześniejszej implementacji screena. Faktycznie używam powyższego skryptu z ekranem. Prawdopodobnie zechcesz także użyć nazwanej sesji ekranowej, a nie tylko pid, jak w przykładzie.

Jason Axelson
źródło
Dzięki! Do czego dokładnie służy „-o BatchMode = yes”?
GJ.
Pozwoli ci to nie pytać o hasło. Z „man ssh_config”: „Zapytanie o hasło / hasło zostanie wyłączone. Ta opcja jest przydatna w skryptach i innych zadaniach wsadowych, w których żaden użytkownik nie jest obecny, aby podać hasło.” Dlatego używaj go tylko wtedy, gdy masz już klucze ssh.
Jason Axelson
5

Nie musisz hakować pętli bash. Musisz zajrzeć do autossh . Sam nie używałem go zbyt często, ale rozumiem, że po prostu zastępujesz sshje autosshswoim rozkazem.

Edycja: W rzeczywistości autossh zawiera skrypt o nazwie, rscreenktóry wydaje się być zaprojektowany właśnie do tego celu.

Ryan C. Thompson
źródło