Adjuntar para ejecutar shell remoto con eshell / TRAMP / dtach

11

A menudo uso GNU Screen para mantener vivas las sesiones remotas. Como vivo en Emacs, me gustaría poder reanudar una sesión de shell remota en ejecución desde Emacs.

GNU Screen implementa todo tipo de cosas elegantes como multiplexación de terminales y dibujo de personajes que realmente no necesito. Realmente solo estoy interesado en tener sesiones de shell desmontables y reanudables, por lo que algo tan simple como dtachpodría ser suficiente.

Estoy usando esta función para abrir una sesión SSH y volver a conectarme a una dtachsesión en ejecución shell-mode(tomada de aquí ):

(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))))

A pesar de las peculiaridades menores, esto funciona casi bien shell-mode, pero en Eshell esto solo inicia un subproceso, por lo que el terminal se vuelve muy limitado (por ejemplo, sin autocompletar la ruta).

¿Cómo puedo configurar Eshell para conectarse a una dtachsesión en ejecución al conectarme a un servidor remoto?

EDITAR: Al volver a pensar en este problema, me di cuenta de que no está del todo claro lo que realmente quiero. Aquí hay una lista:

  • Quiero quedarme en eshell, no en algún subproceso
  • al volver a conectarlo, quiero que se reproduzca la salida de la sesión remota y que el historial de comandos remotos esté disponible
  • Quiero poder interactuar con un proceso remoto en ejecución (por ejemplo, una ejecución en yum installespera de mi entrada)

Parece que tendré que escribir un poco de código elisp para que todo funcione con dtach.

rekado
fuente
el modo shell interactúa con un proceso shell, eshellES el shell, por lo que conceptualmente me parece que no puede hacer lo que quiere, a menos que acceda a un emacs en ejecución con un búfer eshell en la sesión dtach. ¿O me equivoco aquí?
Tom Regner
En eshelllas líneas entre lo que es local y lo que es remoto y lo que es un comando externo y una función de elisp, están borrosas. Me gustaría hacerlo aún más difuso para que los procesos de ejecución remota puedan interactuar de forma transparente como si fueran locales. Creo que eso sería casi lo mismo que "reanudar" una sesión en ejecución.
rekado
@sds: correr screendentro de shell-modeno va a funcionar bien, porque screennecesita más que una terminal tonta.
rekado

Respuestas: