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.
PS1
ist eine beliebte, aber fehlerhafte Methode, um zu überprüfen, ob die Shell interaktiv ist. Insbesondere gibt es viele Systeme, auf denenPS1
eine Umgebungsvariable endet, die in jeder von Ihnen ausgeführten Shell festgelegt ist. Verwenden Siecase $- in *i*) echo interactive;; *) echo not interactive;; esac
oder 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.