Wie effektiv Bildschirm und SSH verwenden?

12

Ich möchte SSH und Bildschirm so konfigurieren, dass eine Anmeldung immer wieder mit einer Bildschirmsitzung verbunden wird. Im Idealfall würde diese Sitzung nicht beendet, sondern getrennt, wenn ich Cd drücke. Wie kann das erreicht werden? Und welche weiteren nützlichen Einstellungen erleichtern mein SSH-Leben?

Tobias Kienzler
quelle

Antworten:

9

Ich habe nur Folgendes für alle meine Server ausgeführt, damit ich beim Herstellen einer Verbindung über SSH automatisch in eine Bildschirmsitzung versetzt werde.

Fügen Sie dem ~ / .bashrc für Ihre Benutzerkonten Folgendes hinzu:

# 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
  screen -RR -S main || echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]

Dadurch wird eine Bildschirmsitzung mit dem Namen main gestartet, wenn sie nicht vorhanden ist, oder eine erneute Verbindung hergestellt, wenn dies der Fall ist. Dies geschah, weil mehrere andere Bildschirmsitzungen für verschiedene Dienste getrennt ausgeführt wurden und keine Verbindung zu ihnen herstellen wollten.

Dämon des Chaos
quelle
Ich wollte nur hinzufügen, dass die Tastenkombination STRG-d im Bildschirm Standard ist, um sich von einer laufenden Bildschirmsitzung zu lösen.
Daemon of Chaos
8

Ich habe in meinem .bash_profile auf meinen Remote-Servern Folgendes:

if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
    reattach() {
        if [ -n "${SSH_AUTH_SOCK}" ]; then
            ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
            SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
        fi
        exec screen -A -D -RR ${1:+"$@"}
    }
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

Damit werden zwei Dinge erreicht: Erstens wird eine Shell-Funktion eingerichtet, um die Shell zu ersetzen und die ssh-agent-Verbindung fortzusetzen. Zweitens wird die Funktion nach einer Pause von einigen Sekunden aufgerufen (falls der Bildschirm nicht gestartet werden soll).

Die erste ifKlausel ist wahr, wenn screen ( -z "${STY}") noch nicht an ein Terminal ( -t 0) angehängt ist und sudo nicht ausgeführt wird (was sich manchmal nicht ändert $USER).

Die reattachFunktion prüft zunächst, ob ssh mit einem aktiven ssh-Agent-Port ( -n "${SSH_AUTH_SOCK}") aufgerufen wurde . Dann wird alles, was sich gerade in ~/.ssh/agent-scriptder aktiven Socket-Datei befindet, ersetzt und die Umgebungsvariable ( $SSH_AUTH_SOCK) durch den neuen Wert ersetzt. Das Skript ersetzt dann die aktuelle Shell durch eine einzelne screenSitzung (wobei sicherzustellen ist, dass nur eine Sitzung vorhanden ist). Alle Argumente für die reattachFunktion werden an command ( ${1:+"$@"}) übergeben.

Der letzte Teil entfernt zuerst alle toten Sitzungen ( screen -wipe), teilt dem Benutzer (mir) mit, dass der Bildschirm in Kürze gestartet wird, und kann stattdessen durch Drücken von Ctrl- zur Shell zurückkehren C. Dann wartet es 5 Sekunden und ruft die reattachFunktion auf.

Arcege
quelle
4

Erstens, wenn Sie byobu verwenden, können Sie eine neue Shell-Sitzung so konfigurieren, dass byobu immer automatisch gestartet wird (was im Wesentlichen eine nette Bildschirmkonfiguration ist, obwohl neuere Versionen möglicherweise tmux als Backend verwenden). Wenn Sie Byobu wirklich nicht wollen, können Sie den Bildschirm wahrscheinlich so einstellen, dass die Verbindung manuell hergestellt wird, indem Sie Ihr .profileoder ein anderes Shell-Konfigurationsskript wie folgt bearbeiten: exec screenif TERM != "screen".

Wenn Ihnen das nicht gefällt, können Sie mit der authorized_keysDatei einen bestimmten Befehl für Verbindungen mit einem bestimmten Schlüssel ausführen (und Sie können so viele Schlüssel haben, wie Sie möchten). Siehe man sshdfür weitere Einzelheiten. Ich würde vorschlagen, dass Sie den Befehl veranlassen, ein Skript auszuführen, das prüft, ob der Bildschirm ausgeführt wird und eine Verbindung hergestellt wird, oder eine neue Sitzung startet.

In Verbindung zu trennen bei Strg-D können Sie in Ihrem Bildschirm Tastenzuordnungen einrichten .screenrc. Siehe man screenfür weitere Einzelheiten. Du suchst nach "bindkey".

ams
quelle
2

Vielleicht völlig irrelevant für Ihre Frage, aber haben Sie jemals darüber nachgedacht, TMUX stattdessen zu verwenden? Es bietet eine Menge Funktionen, nach denen Sie sofort suchen.

Z.B. Wenn Sie unter TMUX die Verbindung zu einer SSH-Sitzung trennen, müssen Sie lediglich ssh zurücksetzen und "tmux a" ausführen, um eine Verbindung zu Ihrer Sitzung herzustellen. Seit ich TMUX benutze, habe ich vergessen, was Nohup / Disown-Befehle sind ... wenn Sie etwas ausführen und sich abmelden müssen - führen Sie es in tmux aus und trennen Sie es. Die Befehlsausgabe wird gepuffert, sodass Sie sie später überprüfen können.

Zum automatischen Anhängen können Sie Folgendes zu .bashrc hinzufügen:

[ -z $TMUX ] && tmux list-sessions 2>/dev/null && tmux a

oder noch einfacher

tmux a 2>/dev/null

Es hat weniger Speicherbedarf und insgesamt IMHO viel besser / einfacher zu bedienende Option.

Die Meta-D-Verknüpfung ist die Standardzuordnung zum Trennen in TMUX.

Alex
quelle
0

screen -dAr default || screen -AS defaultfunktioniert bei mir. Ich füge das zu meinem ~ / .bashrc hinzu .

Erklären Sie kurz die Schalter:

  • d - Trennen Sie den Bildschirm von einer anderen Sitzung, wenn er noch verbunden ist.
  • A - Passen Sie die Fenster im Bildschirm an die neue Terminalgröße an.
  • r default - An einen Bildschirm namens Standard anhängen.

Wenn der erste Bildschirmbefehl (der vorherige ||) nicht erfolgreich ist, wird der zweite ausgeführt:

  • A - Wie oben erklärt ...
  • S default- Erstellen Sie die neue Bildschirmsitzung mit dem Standardnamen .
Batandwa
quelle
0

Ich schlage vor, Byobu zu verwenden . Dieses Tool verwendet tmux und bietet eine schöne Symbolleiste und andere praktische Fensterschaltfunktionen, Hotkeys usw.

echo "new-session" >> ~/.byobu/.tmux.conf
echo "if [ -n '\$TMUX' ]; then :; else byobu attach; fi" >> ~/.bashrc

Mit diesen Befehlen kann das System nach einer erfolgreichen SSH-Anmeldung versuchen, eine Verbindung zu einer vorhandenen byobu-tmux-Sitzung herzustellen, andernfalls wird eine neue Sitzung erstellt.

Sandeep
quelle