automatycznie uruchom ekran po zalogowaniu ssh

19

Czytałem o tym, jak automatycznie uruchomić ekran, kiedy przechodzę sshdo zdalnego serwera. Chciałbym dodać prostą jedną linijkę, aby dodać ją do mojej, .bash_profileaby rozpocząć, screenkiedy jestem sshw środku, i NIE wychodzić z mojego zdalnego połączenia po odłączeniu ekranu.

I zostały patrząc exec screeni prawie każda kombinacja -d, -r, -Di -Rnie może dowiedzieć się, co muszę flagi.

Idealnie byłoby napisać ssh whateveri zalogować się na serwerze w nowym screenlub może on ponownie podłączyć stary ekran, chciałbym wiedzieć, jak to zrobić, aby zobaczyć, które lubię bardziej. Następnie mogę wpisać Ctrl adlub Ctrl d, aby przywrócił mnie do normalnego sshlogowania dla tego serwera (gdzie zobaczysz motd). Stamtąd mogę screen -rwrócić do dowolnego ekranu lub nacisnąć Ctrl dponownie, aby się wylogować.

Ronald Dregan
źródło

Odpowiedzi:

19

Proste screen -Rpowinno załatwić sprawę.

Aby to zweryfikować, dodałem screen -Rdo mojego pliku .bash_profile na zdalnym serwerze, zalogowałem się, odłączyłem od ekranu i zostałem przywrócony do normalnego polecenia powłoki na zdalnym serwerze. Zweryfikowano również z .bashrc. Kolejne logowanie przyniosły oczekiwany wynik (ponowne dołączenie do sesji ekranowej).

btanaka
źródło
Dzięki! Czytałem i miałem wrażenie, że będę potrzebował exec-screena. Cieszę się, że to zadziałało
Ronald Dregan,
Czy to zły pomysł, aby umieścić logoutlub exitzaraz po tym wierszu sesja ssh jest natychmiast kończona po zamknięciu ekranu przez ctrl + D?
Griddo
To mi nie zadziałało. Uruchomiłem kilkadziesiąt ekranów, ponieważ linia jest wykonywana przy każdym rozpoczęciu sesji. Jak to zrobiłeś, aby tak się nie stało?
Thomas
11

Miałem problemy z tworzeniem 40 kaskadowych sesji ekranowych z niektórymi rozwiązaniami podczas uruchamiania nowego okna lub sesji ekranowej. Byłem w stanie wyeliminować ekran kaskadowy i utworzyć nową sesję, jeśli nie istniała z tym:

if [ -z "$STY" ]; then screen -R; fi

Sprawdza, czy jesteś w sesji ekranowej i uruchamia się, screen -Rjeśli nie. Bez testu pojawi się komunikat „Dołączanie z wnętrza ekranu?” ostrzeżenie z ekranu za każdym razem, gdy tworzysz nowe okno ekranu.

seq3
źródło
+1 - jak ten lepszy niż screen -lstest, o którym wspomniał Tony
cwd
10

screen -RR połączy się ponownie z pierwszą dostępną sesją lub utworzy jedną, jeśli to konieczne.

użytkownik1187902
źródło
to było naprawdę przydatne, ponieważ używanie screen -R powodowało problemy z wieloma sesjami.
David V.
To jest niesamowite, dzięki! Łączy się z pierwszą znalezioną sesją „Odłączoną” (jeśli taka istnieje) i ignoruje dołączone sesje. Pozwala to na zalogowanie się i otwarcie wielu okien, ale jednocześnie upewnij się, że każda sesja ma ochronę przed uruchomieniem na ekranie. Nasi ludzie OPS dziękuję!
Ian McGowan
8

Jeśli rozumiem twoją potrzebę, powinieneś spróbować:

if $(screen -ls | grep -q pts); then screen -x; else screen -R; fi

Utworzy tylko jedną sesję ekranu, w przeciwnym razie ponownie połączy się z istniejącą w trybie wielu okien (nawet jeśli masz wiele sesji ssh, skończysz na tej samej sesji)

Tony
źródło
Podoba mi się ten pomysł, ponieważ rozpoznajemy, że mamy klientów SSH z wieloma oknami (lub czasami logujemy się bezpośrednio na maszynie). Jest dość elastyczny, jeśli używasz czegoś takiego jak Bitvise i masz otwartych wiele okien terminali - możesz zamienić poszczególne okna ekranu w osobne okna fizyczne.
Piku
1
Wszystko to można zastąpić screen -xR, co wydaje się sparsowane jako „dołącz, jeśli jest coś do przyłączenia, w przeciwnym razie utwórz nowy ekran”.
Piskvor opuścił budynek
0

Oto małe rozszerzenie

skrypt skryptu bashrc sprawdza, czy istnieje więcej niż jedna odłączona sesja ekranowa. Jeśli jest ich więcej, musisz wybrać sesję ręcznie. Gdy jest sesja odłączona, wracasz do tej sesji. Jeśli wyjdziesz z sesji, sesja ssh również się zamknie.

 #Start Screen
 if [ -z "$STY" ]; then

 value=$( screen -ls |grep '\<pts.*Detached\>' |wc -l )

 if [ $value -gt 1 ]; then

  screen -ls

 else

  screen -R

  echo 5 Sek. bis die SSH Session beendet wird.

  echo Strg + C - um ohne screen weiter zu arbeiten.

  sleep 6

  exit

 fi

fi
Tomasz
źródło
0

Jeśli chcesz automatycznie łączyć się z sesją ekranową po połączeniu przez SSH, dodaj poniższy kod do swojego .bash_profilelub twojego .bashrcna zdalnym komputerze:

  • Rozpocznij nową sesję ekranu za każdym razem, gdy łączysz się przez SSH.
  • Ponownie użyj już istniejącej odłączonej sesji ekranu, zawsze zaczynając od najnowszej. Jeśli nie są dostępne żadne odłączone sesje, rozpoczyna się nowa.
  • Gdy otworzysz wiele połączeń SSH do komputera, otrzymasz inną sesję ekranu, ponieważ ponownie używamy tylko odłączonych.
  • Unikaj pętli, jeśli dodajesz skrypt do swojego .bashrc

Oto skrypt:

#!/bin/bash
#
#  Attaches to the first Detached Screen. Otherwise starts a new Screen.

# Only run if we are not already inside a running screen and only if in an SSH session.
if [[ -z "${STY}" && ! -z "${SSH_CLIENT}" ]]; then
  detached_screens=($(screen -ls | grep pts | grep -v Attached))

  for screen in "${detached_screens[@]}"; do
    if [[ "${screen}" == *".pts"* ]]; then
      IFS='.pts' read -ra split <<< "${screen}"
      for id in "${split[@]}"; do
        first_id="${id}"
        break
      done 
      break
    fi
  done

  screen -R $first_id
fi

PS: Jeśli chcesz włączyć to dla lokalnego terminala, usuń && ! -z "${SSH_CLIENT}w pierwszej linii.

Nicolas Garnier
źródło