it-swarm.com.de

Fortsetzen des Befehls, der in einer unterbrochenen SSH-Sitzung ausgeführt wird

Lesen diese Frage hat mich zum Staunen gebracht. Angenommen, screen wird nicht verwendet. Wenn eine SSH-Sitzung auf einem Linux-Ziel aus irgendeinem Grund abgebrochen wird und Sie die Verbindung erneut herstellen, bevor der Server die Sitzung aufgrund eines Zeitlimits beendet, können Sie die Kontrolle über den ausgeführten Befehl wiedererlangen, sodass er aufgrund der unterbrochenen Sitzung nicht abgebrochen wird ?

33
John Gardeniers

Der Versuch, die aktuellen STD * -Dateideskriptoren eines neuen Terminals mit einem alten laufenden Prozess zu verbinden, ist nur ein Problem. Selbst wenn Sie dies schaffen, funktioniert die Jobsteuerung des Terminals nicht wie erwartet. Sie werden ein Durcheinander hinterlassen, wenn Sie das übernommene Programm beenden und was mit der Shell passiert, die ihre Dateideskriptoren geopfert hat, um sie dem Prozess mit neuem Hintergrund zu übergeben. Wird ssh offen bleiben, wenn diese Shell verschwindet? Wahrscheinlich nicht. Sie müssen es also zuerst an eine andere Stelle umleiten.

Möglich oder nicht, ich würde wetten, dass es wünschenswerter ist, den abgebrochenen Prozess "natürlich" töten zu lassen. Wenn Sie etwas Wichtiges tun, um zu rechtfertigen, dass Sie versuchen, alle für die Wiederaufnahme der Kontrolle erforderlichen Hackerangriffe auszuführen nd Sie befinden sich auf einem instabilen Link, sollten Sie dies wahrscheinlich im Voraus wissen und einfach screen (oder vnc) verwenden oder was auch immer Ihr freistehendes Kontrollboot schwimmt). :) :)

13
dannysauer

Ich weiß, dass dies eine alte Frage ist, aber ich hielt es für wichtig, meine Erkenntnisse hinzuzufügen, falls jemand anders wie ich darauf stößt.

Ich habe keine ungewöhnlichen Konsequenzen dafür gesehen, ja, aber das habe ich verwendet und es hat erstaunlich funktioniert. Wenn wir lange Prozesse auf unserem Server ausführen, wird manchmal die SSH-Sitzung getrennt. Der Prozess zusammen mit der tty-Sitzung scheint weiterhin zu laufen, aber wir können keine Verbindung mehr herstellen. Ich habe das folgende Programm gefunden, um den Prozess auf die neu verbundene Sitzung zu übertragen.

https://github.com/nelhage/reptyr

Hier gibt es mehr Infos

https://blog.nelhage.com/2011/02/changing-ctty/

5
user215086

Im Allgemeinen ist es der richtige Weg, dies im Voraus vorzubereiten, indem Sie die Mechanismen GNU screen oder bash Nohup oder disown verwenden Wenn Sie tcsh verwenden, lehnt die Shell Hintergrundjobs ab, wenn sie abnormal beendet wird.

Wenn Sie screen nicht verwenden, aber es geschafft haben, Ihren Prozess über eine der disown Methoden am Laufen zu halten, können Sie dies möglicherweise gefälschte Wiederverbindung mit dem Prozess mit gdb ( Quelle ):

[...] mit einigen schmutzigen Hacks ist es nicht unmöglich, einen Prozess 'stdout/stderr/stdin' erneut zu öffnen. [...]

Und dann verwenden Sie gdb zum Beispiel, um eine Verbindung zum Prozess herzustellen, und führen Sie einen Aufruf close (0) durch.
Aufruf schließen (1)
Aufruf schließen (2)
Aufruf offen ("/ dev/pts/xx", ...)
call dup (0)
call dup (0)
ablösen

Jetzt müssten Sie diesen Prozess für Ihre Situation anpassen. Ich bezweifle, dass es helfen würde, wenn Sie es nicht geschafft hätten, den Prozess abzulehnen . Wenn Sie bash verwenden, siehe diesen Beitrag über das automatische Erstellen von Bash Hintergrundprozesse beim Beenden ablehnen (grundsätzlich deaktivieren huponexit mit shopt ). Bei einem Vordergrundprozess müssen Sie Nohup verwendet haben.

4
quack quixote

Wahrscheinlich nicht. Ich kann nicht garantieren, dass es unmöglich ist, aber ich bezweifle es wirklich.

Eine Sache ist das Fehlen des Abschaltens der Shell und mögliche Befehle, die als Folge der Beendigung der SSH-Verbindung ausgeführt werden. Dies ist nicht so schwierig, Sie sollten in der Lage sein, Nohup und ähnliche Mechanismen wie in der anderen Frage erwähnt zu verwenden.

Angenommen, Sie haben ssh somehost nuhup vim /some/file und die Verbindung wird unterbrochen. Sie laufen ssh somehost, um sich erneut anzumelden und zu sehen, dass Ihr vim-Prozess noch ausgeführt wird. Aber wie verbinden Sie sich wieder mit diesem Prozess? Interaktive Forground-Prozesse haben ein Controlling tty und dasjenige, das für Ihren vim-Prozess geöffnet wurde, als es gestartet wurde, wäre seitdem geschlossen worden. Ich bin nicht sicher, ob es eine Möglichkeit gibt, sie in Ihrer neuen Shell erneut zu "öffnen" (so als ob in einer Shell mehrere Hintergrundjobs ausgeführt werden, können Sie keine in einer anderen Shell in den Vordergrund stellen).

Screen wurde explizit geschrieben, um diese Funktionalität zu haben. Beim Start werden zwei Prozesse gegabelt, ein Terminalverwaltungsprozess und ein Clientprozess. Bei der Interaktion handelt es sich um die Anwendung Client <--> Terminal Manager <-->. Wenn Sie die Verbindung trennen oder die Verbindung verlieren, wird der Clientprozess beendet, während der Terminal Manager weiterhin aktiv ist. Screen hat eine spezielle Unterstützung, die später wieder an den Terminalverwaltungsprozess angehängt werden kann, und ich denke nicht, dass dies im allgemeinen Fall möglich ist.

1
hlovdal

retty kann Ihnen vielleicht helfen, aber die Haftungsausschlüsse sind sehr real und relevant :)

1
Evan Broder

Wenn session gelöscht wird, bedeutet dies, dass TTL bereits abgelaufen ist, sodass für Sie (wie ich es verstehe) kein tty mehr vorhanden ist. Wenn Ihre Netzwerkverbindung jedoch besteht Wenn Ihre SSH-Sitzung unterbrochen wird, muss sie möglicherweise nicht unterbrochen werden, und Sie sollten in der Lage sein, Ihre Verbindung wieder aufzunehmen und fortzufahren. Fragen Sie danach?

1
monomyth

In diese Frage gab es einen Link zu einem Hacky-Tty-Diebstahl-Code. Sie sollten theoretisch in der Lage sein, damit die Kontrolle über einen Nohup-Prozess zurückzugewinnen.

0
Kamil Kisiel