Startet den Bildschirm automatisch beim SSH-Login


18

Ich habe gelesen, wie ein Bildschirm automatisch gestartet wird, wenn ich sshzu einem Remote-Server gehe. Ich möchte, dass ein einfacher Einzeiler zu meinem hinzugefügt wird, .bash_profiledamit er startet, screenwenn ich sshmich anmelde, und NICHT meine Remoteverbindung beendet, wenn ich den Bildschirm trenne.

Ich habe mich in exec screenund so ziemlich jede Kombination von -d, -r, -Dund -Rund kann nicht herausfinden , was Flagge ich brauche.

Idealerweise würde ich tippen ssh whateverund in einem neuen Server eingeloggt sein screenoder einen alten Bildschirm wieder anbringen. Ich würde gerne wissen, wie man beides macht, um zu sehen, was mir besser gefällt. Dann kann ich entweder tippen Ctrl adoder Ctrl dund es wieder zum normalen sshLogin für diesen Server bringen lassen (wo du den motd sehen würdest). Von dort aus kann screen -rich in den gewünschten Bildschirm zurückkehren oder Ctrl derneut drücken, um mich abzumelden.

Antworten:


18

Ein einfacher screen -Rsollte den Trick machen.

Um dies zu überprüfen, fügte ich screen -Rmeinem .bash_profile auf einem Remoteserver hinzu , meldete mich an, löste mich vom Bildschirm und wurde zu einer normalen Shell-Eingabeaufforderung auf dem Remoteserver zurückgeführt. Verifiziert auch mit .bashrc. Nachfolgende Anmeldungen ergaben das erwartete Ergebnis (erneutes Anhängen an die Bildschirmsitzung).


Vielen Dank! Ich las herum und hatte den Eindruck, dass ich exec screen -R brauchen würde.
Ich bin

Ist es eine schlechte Idee, diese Zeile zu setzen logoutoder exitdirekt danach eine SSH-Sitzung zu beenden, sobald der Bildschirm mit Strg + D geschlossen wird?
Griddo

Das hat bei mir nicht geklappt. Ich habe ein paar Dutzend Bildschirme gestartet, da die Zeile bei jedem Sitzungsstart ausgeführt wird. Wie haben Sie das gemacht, damit das nicht passiert?
Thomas

10

Ich hatte Probleme mit 40 kaskadierenden Bildschirmsitzungen, die mit einigen der Lösungen beim Starten eines neuen Fensters oder einer neuen Bildschirmsitzung erstellt wurden. Ich konnte den Kaskadenbildschirm entfernen und eine neue Sitzung erstellen, wenn es damit keine gab:

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

Es testet, ob Sie sich in einer Bildschirmsitzung befinden, und wird ausgeführt, screen -Rwenn dies nicht der Fall ist. Ohne den Test erhalten Sie die Meldung "Anhängen von der Innenseite des Bildschirms?". Warnung vom Bildschirm jedes Mal, wenn Sie ein neues Bildschirmfenster erstellen.


+1 - so besser als der screen -lsTest, den Tony erwähnte
cwd

9

screen -RR wird der ersten verfügbaren Sitzung erneut zugeordnet oder bei Bedarf eine erstellt.


Das war sehr nützlich, da die Verwendung von screen -R mir bei mehreren Sitzungen Probleme bereitete.
David V.

Das ist großartig, danke! Es stellt eine Verbindung zur ersten "getrennten" Sitzung her (sofern vorhanden) und ignoriert angehängte Sitzungen. So können Sie sich anmelden und mehrere Fenster öffnen, aber dennoch sicherstellen, dass jede Sitzung den Schutz hat, auf einem Bildschirm ausgeführt zu werden. Unsere OPS-Mitarbeiter danken Ihnen!
Ian McGowan

8

Wenn ich Ihre Bedürfnisse verstehe, sollten Sie versuchen:

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

Es wird nur eine Bildschirmsitzung erstellt, andernfalls wird die Verbindung mit der vorhandenen Sitzung unter mehreren Fenstern wiederhergestellt.


Diese Idee gefällt mir, weil wir erkennen, dass wir SSH-Clients mit mehreren Fenstern haben (oder uns manchmal direkt auf dem Computer anmelden). Es ist recht flexibel, wenn Sie so etwas wie Bitvise verwenden und mehrere Terminalfenster geöffnet haben. Sie können einzelne Bildschirmfenster in separate physische Fenster umwandeln.
Piku

1
All dies kann durch screen -xR"Anhängen, wenn es etwas zum Anhängen gibt, andernfalls neuen Bildschirm erstellen" ersetzt werden.
Piskvor

0

Hier eine kleine Erweiterung,

das Skript für die bashrc-Prüfung, ob es mehr als eine getrennte Bildschirmsitzung gibt. Wenn mehr vorhanden ist, müssen Sie das Sitzungshandbuch auswählen. Wenn es eine getrennte Sitzung gibt, kehren Sie zu dieser Sitzung zurück. Wenn Sie die Sitzung beenden, wird auch die SSH-Sitzung geschlossen.

 #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

0

Wenn Sie beim Herstellen einer Verbindung über SSH automatisch eine Verbindung zu einer Bildschirmsitzung herstellen möchten, fügen Sie den folgenden Code zu Ihrem .bash_profileoder .bashrcIhrem Remote-Computer hinzu:

  • Starten Sie bei jeder Verbindung über SSH eine neue Bildschirmsitzung.
  • Verwenden Sie bereits vorhandene getrennte Bildschirmsitzungen erneut, wobei Sie immer mit der neuesten beginnen. Wenn keine getrennten Sitzungen verfügbar sind, wird eine neue gestartet.
  • Wenn Sie mehrere SSH-Verbindungen zu Ihrem Computer herstellen, wird eine andere Bildschirmsitzung angezeigt, da nur getrennte Verbindungen wiederverwendet werden.
  • Vermeiden Sie Schleifen, falls Sie das Skript zu Ihrem hinzufügen .bashrc

Hier ist das Skript:

#!/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: Wenn Sie dies für das lokale Terminal aktivieren möchten, entfernen Sie && ! -z "${SSH_CLIENT}in der ersten Zeile.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.