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 dtach
podría ser suficiente.
Estoy usando esta función para abrir una sesión SSH y volver a conectarme a una dtach
sesió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 dtach
sesió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 install
espera de mi entrada)
Parece que tendré que escribir un poco de código elisp para que todo funcione con dtach.
eshell
las 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.
screen
dentro de shell-mode
no va a funcionar bien, porque screen
necesita más que una terminal tonta.
eshell
ES 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í?