Über ssh in einer anderen Sitzung anmelden?

329
Jordan Reiter

Ich weiß nicht genau, was der richtige Begriff ist, aber ich stelle fest, dass ich mich bei einem Remote-SSH-Server anmelde, das Fenster schließe, ein neues Fenster öffne und mich erneut bei diesem Server anmelde Sei anders. Wenn ich beispielsweise einen Hintergrundprozess gestartet habe, kann ich nicht mehr darauf zurückgreifen, oder etwas, das ich eingetippt habe, wird nicht in meiner Bash-Historie angezeigt.

Das Problem ist aus irgendeinem Grund gelegentlich mit meiner Remote-Sitzung passiert, und anstatt die Verbindung zu trennen, bleibt die Sitzung hängen; Ich muss das Fenster schließen und ein neues öffnen, um die Verbindung wieder herzustellen. Infolgedessen bedeutet dies manchmal, dass ein langwieriger Prozess im Grunde "verloren" ist, da ich nicht mehr darauf zurückkommen kann.

Gibt es eine Möglichkeit, es so einzurichten, dass ich mich bei meiner erneuten Anmeldung an derselben "Sitzung" anmelde?

Dies verwendet OS X Terminal.

2
Verwenden Sie etwas wie "screen", "tmux" oder "dtach". jjlin vor 10 Jahren 7
Manchmal geht es nur darum, zu wissen, was ich eigentlich für Google tun sollte: [Bildschirm: Lässt Ihre Prozesse trotz unterbrochener Verbindung laufen] (http://www.howtoforge.com/linux_screen) Jordan Reiter vor 10 Jahren 1
In [Terminal nach SSH-Verbindung ohne Multiplexer fortsetzen (Bildschirm / tmux)] (http://superuser.com/q/645540/150988) und den dazugehörigen Kommentaren finden Sie einige Vorschläge. Scott vor 10 Jahren 0

2 Antworten auf die Frage

4
Gabe

Wenn Sie sich an der Remote-Maschine anmelden, ordnet die sshd dort ein Pseudo-Terminal zu und startet Ihre Login-Shell. Alle Prozesse, die Sie starten, Hintergrund oder Vordergrund, sind untergeordnete Prozesse dieser Shell. (Informieren Sie sich über "Fork", "Parent Process" und "Child Process"; verwenden Sie den Befehl "pstree", um den Status des Systems anzuzeigen.)

Wenn Sie die Verbindung trennen, indem Sie beispielsweise Ihren Client schließen, schließt die sshd das Pseudo-Terminal. Auf diese Weise wird der Shell-Prozess (indirekt auf "Kontrollterminal" und "Sitzungsleiter" vorgelesen) beendet, was dazu führt, dass seine untergeordneten Elemente entweder beendet werden oder weil ihr Elternteil jetzt verschwunden ist init. (Lesen Sie sich das "HUP-Signal" durch - es sollte sich in dem Steuergerät befinden, das Sie finden - und dem nohupBefehl.)

Wenn Sie erneut eine Verbindung herstellen, weist sshd ein neues Pseudo-Terminal zu und startet eine neue Instanz Ihrer Login-Shell. Es gibt keinen Mechanismus, um die zuvor ausgeführten Prozesse - sofern sie noch laufen - an diese Shell anzuhängen (wenn dies der Fall wäre, müsste jedes Programm wissen, wie mit spontan erscheinenden untergeordneten Prozessen umzugehen ist, die möglicherweise den Standard gemeinsam nutzen möchten) In / Output usw. Eine "Shell" ist nur für Sie als Benutzer ein spezieller Prozess, nicht für das System).

Die einzige Möglichkeit, dies zu tun, besteht darin, ein Programm wie screenoder zu verwenden tmux(möglicherweise gibt es andere). Hierbei handelt es sich im Wesentlichen um einen Serverprozess, der seine eigenen Pseudo-Terminals mit Shells und was auch immer sonst verwaltet, und einen Client-Prozess, der Ihnen den Inhalt dieser ptys anzeigen und Ihre Eingaben senden kann. Wenn Sie die Verbindung trennen, wird der Client-Prozess abgebrochen, aber wenn Sie die Verbindung wieder herstellen, können Sie einen neuen Prozess starten - der Server wird weiterhin ausgeführt.

(Es gibt einige zu starke Vereinfachungen, aber das sollte Sie dazu bringen, zu verstehen, was tatsächlich passiert. Lesen Sie unter "Pseudo-Terminal" nach.)

0
Rafareino

Tatsächlich gibt es keine Möglichkeit, Ihre Sitzung wiederherzustellen . Was Sie tatsächlich abrufen können, ist Ihr Verlauf.

Dazu (in Bash) müssen Sie eine Zeile in Ihr .bash_profile in Ihr Home-Verzeichnis aufnehmen (oder ändern), um Bash zu sagen, um Ihre eingegebenen Befehle zu speichern:

export HISTSIZE=1000 # to keep a thousand commands in history export HISTCONTROL=ignoreboth # to prevent some strange behaviors 

Dann werden alle Befehle, bis die Tausender erreicht sind, in die .history-Datei geschrieben. Sie können die letzten Befehle durch Eingeben anzeigen

history 

Suchen Sie sie, indem Sie die Tastenkombination Strg + R drücken, gefolgt von einem Teil des Befehls, den Sie abrufen möchten.

Lassen Sie mich sagen, dass sich dieser Verlauf auf der Serverfestplatte befindet. Wenn Sie sich auf einem gemeinsam genutzten Server befinden, sollten sich die Befehle anderer Benutzer in derselben Verlaufsdatei befinden. Wenn Sie also ihre Befehle anstelle von Ihren Befehlen sehen, sollte dies mit Strg + R gelöst werden Problem.

PS: Um diese Antwort anzuwenden, stellen Sie sicher, dass Sie in bash laufen. Geben Sie einfach ein

ps 

und suche irgendwo auf dem Bildschirm nach einem Schlag. So was:

 PID TTY TIME CMD 24165 pts/3 00:00:00 bash 24169 pts/3 00:00:00 ps 

und Sie können viel mehr lernen

man bash 

Das Lesen würde jedoch sehr viel Zeit in Anspruch nehmen.