Mit eshell / TRAMP / dtach an die laufende Remote-Shell anschließen


11

Ich benutze oft GNU Screen, um Remote-Sitzungen am Leben zu erhalten. Da ich in Emacs lebe, möchte ich wirklich in der Lage sein, eine laufende Remote-Shell-Sitzung in Emacs fortzusetzen.

GNU Screen implementiert alle möglichen ausgefallenen Dinge wie Terminal-Multiplexing und Zeichenzeichnen, die ich wirklich nicht brauche. Ich bin wirklich nur daran interessiert, abnehmbare und wiederaufnehmbare Shell-Sitzungen zu haben, also etwas so Einfaches wie dtachausreichend.

Ich verwende diese Funktion, um eine SSH-Sitzung zu öffnen und eine Verbindung zu einer laufenden dtachSitzung wiederherzustellen shell-mode(von hier aus ):

(defun ssh-dtach (host)
  "Open SSH connection to remote host and attach to dtach session."
  (interactive)
  (let ((explicit-shell-file-name "dtach")
        (explicit-dtach-args '("-A" "/tmp/emacs.dtach" "-z"
                               "/bin/bash" "--noediting" "-login"))
        (default-directory (format  "/ssh:%s:" host)))
    (shell (format "*ssh %s*" host))))

Trotz kleinerer Macken funktioniert dies fast shell-modeeinwandfrei, aber in Eshell wird nur ein Unterprozess gestartet, sodass das Terminal sehr eingeschränkt wird (z. B. keine automatische Vervollständigung des Pfads).

Wie kann ich Eshell so konfigurieren, dass eine Verbindung zu einem laufenden Gerät hergestellt wird? dtach Verbindung zu einem Remote-Server eine Sitzung hergestellt wird?

EDIT: Als ich wieder über dieses Problem nachdachte, wurde mir klar, dass es nicht ganz klar ist, was ich eigentlich will. Hier ist eine Liste:

  • Ich möchte in Eshell bleiben, nicht in einem Teilprozess
  • Beim erneuten Anschließen möchte ich, dass die Ausgabe der Remote-Sitzung wiedergegeben wird und der Remote-Befehlsverlauf verfügbar ist
  • Ich möchte in der Lage sein, mit einem laufenden Remote-Prozess zu interagieren (z. B. einem laufenden yum installWarten auf meine Eingabe).

Es scheint, dass ich ein bisschen Elisp-Code schreiben muss, damit dies alles mit dtach funktioniert.


Der Shell-Modus interagiert mit einem Shell-Prozess, eshellIST die Shell - konzeptionell scheint es mir, dass Sie nicht tun können, was Sie wollen, es sei denn, Sie greifen in der dtach-Sitzung auf einen laufenden Emacs mit einem Eshell-Puffer zu. Oder irre ich mich hier?
Tom Regner

In eshellden Grenzen zwischen lokal und fern ist und was ein externer Befehl und eine elisp-Funktion ist, verschwimmen. Ich möchte es noch unschärfer machen, damit Remote-Prozesse transparent mit ihnen interagieren können, als wären sie lokal. Das wäre fast das Gleiche wie die Wiederaufnahme einer laufenden Sitzung, denke ich.
rekado


@sds: Das Laufen screeninnerhalb von shell-modewird nicht gut funktionieren, da screenmehr als ein dummes Terminal benötigt wird.
rekado

Antworten:


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.