Wie kann ich mich nach einem Rohrbruch wieder mit einer SSH-Sitzung verbinden?


28

Ich lief also apt-get upgradeauf einem Server, als der Router feststellte, dass es zu lange her ist, seit ich das letzte Mal wütend geworden bin : Die Verbindung wurde unterbrochen. Die Moral der Geschichte ist, screenviel zu verwenden, wenn Sie auf einem Penner-Router sind.

Wie auch immer, ich habe mich wieder angemeldet und festgestellt, dass der Prozess immer noch dort hängt und immer noch auf das Upgrade meines Y / n wartet (hatte ihn zum Glück noch nicht getroffen). Kann ich auf irgendeine Weise eine abgebrochene Sitzung wiederherstellen? Am Ende habe ich es nur gekillt, da es sich nicht in der Mitte der Paketverwaltung befand, aber es wäre großartig, es für zukünftige Referenz zu wissen.


1
Ich bin überrascht, dass der apt-getProzess noch lief. Es sollte zusammen mit der gesamten Prozesskette bis zu SSH abgestorben sein. Mir ist aufgefallen, dass do-dist-upgradein einer screen/ byobuSession automatisch gestartet wird: Geht das unter Umständen apt-getauch so?
Nfirvine

Antworten:


16

Die Antwort auf Ihre richtige Frage lautet: Sie können nicht . Ich denke, das Hauptproblem ist, dass die Authentifizierungsverfahren nicht synchron sind. Es funktioniert einfach nicht so.

Wie Sie selbst bemerkt haben, besteht die Lösung darin, wenn möglich screen zu verwenden ( tmux ist übrigens eine Alternative zu screen).


1
Aber was ist, wenn Sie passwortloses ssh haben? Schaffst du es dann?
Sridhar Sarnobat

1
byobuist ein nettes, einfacher zu bedienendes Frontend für screen(oder tmux) - definitiv einen Blick wert (:
drevicko

Sridhar-Samobol, Authentifizierung muss noch stattfinden. Das Anhängen an eine laufende Sitzung hat keine Möglichkeit, den anfänglichen Handshake erneut durchzuführen. Daher würden die Invarianten unterbrochen, wenn wir eine neue Sitzung in eine vorhandene Sitzung einführen würden. Antwort: nein.
Kevr

9

Für die Ausführung langlebiger Prozesse verwende ich screen oder byobu, wenn Sie eine benutzerfreundlichere Oberfläche wünschen.

Für den Bildschirm können Sie Folgendes verwenden:

screen [program] [args]

Dadurch werden [program] und seine [args] in einer Bildschirmsitzung ausgeführt . Sobald das Programm beendet ist, wird die Sitzung automatisch geschlossen. Wenn Sie die Sitzung nach der Ausführung Ihres Programms fortsetzen möchten, führen Sie einfach den Bildschirm ohne Argumente aus. In der Sitzung wird eine neue Eingabeaufforderung angezeigt. STRG + A + D trennt das Terminal von der aktuellen Sitzung.

So fügen Sie eine vorherige Sitzung erneut hinzu:

screen -r

Wenn nur eine Sitzung geöffnet ist, wird die Verbindung sofort wieder hergestellt. Wenn mehrere Sitzungen ausgeführt werden, werden Sie gefragt, zu welcher Sie eine Anlage hinzufügen möchten. Wenn Sie den Sitzungsnamen kennen, können Sie ihn einfach als Argument zu dieser Befehlszeile hinzufügen.

Byobu ist eine schöne Verbesserung. Es basiert auf dem Bildschirm , bietet jedoch eine Leiste am unteren Rand, in der alle aktuellen Sitzungen als Registerkarten angezeigt werden und die das Navigieren in diesen einfacher macht. Sie können:

  • F2 startet eine neue Sitzung
  • F3 wechselt zum nächsten Sitzungsregister auf der linken Seite
  • F4 gehe zur nächsten Session-Registerkarte auf der rechten Seite
  • F8 gibt der aktuellen Sitzungsregisterkarte einen Anzeigenamen
  • F9 öffnet ein Optionsmenü
  • STRG + A + D trennt alle Sitzungen vom Terminal.

HINWEIS : Vermeiden Sie es, eine Sitzung mit dem Benutzer root zu eröffnen . Wenn jemand Zugriff auf Ihr Terminal erhält (lokal oder remote), kann er problemlos eine neue Verbindung zu einer laufenden Sitzung herstellen und Ihr System als Root verwenden. Bei Bedarf ist es am besten, eine Sitzung mit einem gemeinsamen Benutzer und sudo- spezifischen Befehlszeilen zu starten .


1
Darf ich das OP zitieren: "Moral der Geschichte ist, viel Bildschirm zu verwenden ". Anscheinend war das hier nicht die Frage.
Januar

Vielen Dank für das Schreiben, aber der Januar war richtig.

Verwenden Sie sudo screen <Befehl>, um einen Bildschirm als root einzurichten, der sudo-Zugriff benötigt, um erneut eine Verbindung herzustellen. Weitaus besser, als einen Bildschirm normal zu starten und dann zu root zu wechseln.
djsmiley2k - CoW

8

Sie können zwar keine erneute Verbindung zu einer unterbrochenen SSH-Sitzung herstellen, aber Sie können den in SSH ausgeführten Prozess erneut ausführen - funktional entsprechend Ihren Anforderungen.

Anleitung

In Ihrem Fall würden Sie den apt-getzu steuernden Prozess von einer neuen SSH-Sitzung, screenSitzung oder dergleichen übernehmen. Mein Favorit dafür ist der reptyrBefehl:

$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade

Dann mit der PID, die Sie für Ihren Prozess gefunden haben:

$ sudo reptyr -T 10626

Oder wenn das nicht funktioniert, versuchen Sie:

$ reptyr 10626

Nach dieser Phase wird Ihre gesamte Tastatureingabe an das von Ihnen übernommene Programm gesendet. Leider wird die alte Ausgabe der SSH-Sitzung nicht angezeigt, z. B. die apt-getAusgabe, in der Sie um Bestätigung gebeten werden.

Erklärungen

Es gibt mehrere andere Tools, die grundsätzlich genauso funktionieren wie reptyr( ptracedh über einen Debug-Anhang). Sehen Sie sich die folgenden Fragen und Antworten an, wo sie besprochen werden:

In den obigen Anweisungen, die reptyr 10626Anwendungen ptraceDebug - Befestigung während des sudo reptyr -T 10626verwendeten Befehls stiehlt TTY und ist bevorzugt ( Details ).

Der Grund, warum Sie eine SSH-Sitzung nicht auf diese Weise übernehmen können, ist, dass ein sshdProzess nicht von einem Host-Terminal gesteuert wird, sondern den Slave-Teil eines Terminals - ein Gerät - bereitstellt,pts während sich der Master-Teil, der ihn steuert, auf dem befindet Client-Computer, hier mit einer unterbrochenen SSH-Sitzung dazwischen. Wenn Sie die Übernahme eines solchen sshdProzesses erzwingen reptyr -s <pid>, wird Ihre Tastatureingabe an diesen Prozess gesendet, nicht an den aktiven untergeordneten Prozess. Ein "Strg + Z" macht das einfach zunichte sshd.


1

Ich habe do-dist-upgradevia ssh von einem Laptop aus gearbeitet, der in den Suspend ging Broken pipe. Beim erneuten Betreten des Computers wurden die auf das Upgrade bezogenen Prozesse noch ausgeführt, darunter eine whiptailEingabeaufforderung (welche Anzeige-Manager zur Auswahl stehen) und, was relevant ist, ein Root-Prozess SCREEN. Ich war in der Lage zu tun sudo su -und screen -rauf die Sitzung und, siehe da, ich habe den whiptail Dialog vor mir der Lage zu nehmen Eingang zu befestigen. Ich konnte das Upgrade nahtlos fortsetzen.

Hinweis: Dies war ein Upgrade von Ubuntu 14.04 auf 16.04.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.