Probleme mit dem automatischen Startbildschirm bei der SSH-Anmeldung

7

Ich schaue auf http://taint.org/wk/RemoteLoginAutoScreen, um meinen Server so einzurichten, dass er automatisch eine Bildschirmsitzung startet, wenn ich mich über SSH anmelde.

Ich habe meiner .bashrc Folgendes hinzugefügt:

# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session.   Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ]
then
  STARTED_SCREEN=1 ; export STARTED_SCREEN
  [ -d $HOME/lib/screen-logs ] || mkdir -p $HOME/lib/screen-logs
  sleep 1
  screen -RR && exit 0
  # normally, execution of this rc script ends here...
  echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]

Der Haken ist, dass ich immer eine getrennte benannte Bildschirmsitzung habe, auf der ein Rails-Anwendungsserver ausgeführt wird. Wenn ich mich jetzt anmelde, werde ich in diese Sitzung aufgenommen.

Gibt es eine Möglichkeit, den obigen Code so zu ändern, dass die Sitzung weder nach Namen noch nach einem anderen Wert ausgewählt wird? Wenn die getrennte Sitzung die einzige Bildschirmsitzung ist, möchte ich eine neue Bildschirmsitzung starten.

Ein weiteres Problem, auf das ich stoße, ist, dass ich beim Trennen vollständig von meiner SSH-Verbindung abgemeldet bin, anstatt nur die Bildschirmsitzung zu verlassen.

daemonofchaos
quelle
Das Testen auf Leerzeichen PS1ist eine beliebte, aber fehlerhafte Methode, um zu überprüfen, ob die Shell interaktiv ist. Insbesondere gibt es viele Systeme, auf denen PS1eine Umgebungsvariable endet, die in jeder von Ihnen ausgeführten Shell festgelegt ist. Verwenden Sie case $- in *i*) echo interactive;; *) echo not interactive;; esacoder in Bash [[ $- = *i* ]], um nach einer interaktiven Shell zu testen. Verwenden Sie [ -t 0 ]diese Option , um zu testen, ob der Standardeingang ein Terminal ist.
Gilles 'SO - hör auf böse zu sein'

Antworten:

8

Ändern Sie es in:

if [ -z "$STARTED_SCREEN" ] && [ -n "$SSH_TTY" ]
then
  case $- in
    (*i*)
      STARTED_SCREEN=1; export STARTED_SCREEN
      mkdir -p -- "$HOME/lib/screen-logs"
      screen -RR -S main  ||
        echo >&2 "Screen failed! continuing with normal bash startup"
  esac
fi

Das heißt, Sie hängen die Bildschirmsitzung mit dem Namen "main" anstelle der anderen an (oder erstellen sie) und beenden sie nicht, nachdem der Bildschirm erfolgreich zurückgekehrt ist.

Stéphane Chazelas
quelle
Ihr Vorschlag funktioniert perfekt! Vielen Dank. :)
daemonofchaos
@Stephan Chazelas Was bedeutet es $-, wenn ich eacho benutze, dann zeigt es himBH, was es bedeutet? Vielen Dank im Voraus für jede Hilfe :)
Rahul Patil
@RahulPatil Enthält den aktuellen Satz von Shell-Optionen ( ifür interaktiv ( -iOption)). Einzelheiten finden Sie in Ihrem Shell-Handbuch.
Stéphane Chazelas