Anexe ao shell remoto em execução com eshell / TRAMP / dtach

11

Costumo usar o GNU Screen para manter as sessões remotas ativas. Como eu moro no Emacs, eu realmente gostaria de poder retomar uma sessão de shell remota em execução no Emacs.

O GNU Screen implementa todo tipo de coisas sofisticadas, como multiplexação de terminal e desenho de caracteres, das quais eu realmente não preciso. Estou realmente interessado apenas em ter sessões de shell destacáveis ​​e recuperáveis, então algo tão simples quanto dtachpossa ser suficiente.

Estou usando esta função para abrir uma sessão SSH e reconectar-se a uma dtachsessão em execução shell-mode(extraída daqui ):

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

Apesar de pequenas peculiaridades, isso funciona quase perfeitamente shell-mode, mas no Eshell isso apenas inicia um subprocesso, de modo que o terminal se torna muito limitado (por exemplo, nenhum preenchimento automático de caminho).

Como posso configurar o Eshell para conectar-se a uma dtachsessão em execução ao conectar-se a um servidor remoto?

Edição: Como eu pensei sobre esse problema novamente, percebi que não está totalmente claro o que eu realmente quero. Aqui está uma lista:

  • Eu quero ficar no eshell, não em algum subprocesso
  • ao reconectar, quero que a saída da sessão remota seja reproduzida e o histórico de comandos remotos esteja disponível
  • Quero poder interagir com um processo remoto em execução (por exemplo, uma execução yum installaguardando minha entrada)

Parece que vou precisar escrever um pouco de código elisp para fazer tudo funcionar com o dtach.

rekado
fonte
O modo shell interage com um processo do shell, eshellé o shell - então, conceitualmente, parece-me que você não pode fazer o que deseja, a menos que acesse um emacs em execução com um buffer eshell na sessão dtach. Ou estou enganado aqui?
Tom Regner #
Nas eshelllinhas entre o que é local e o que é remoto e o que é um comando externo e uma função elisp, são borradas. Eu gostaria de torná-lo ainda mais confuso, de forma que os processos em execução remota possam interagir com transparência como se fossem locais. Isso seria quase o mesmo que "retomar" uma sessão de corrida, eu acho.
rekado
@sds: rodar screendentro dele shell-modenão vai funcionar bem, porque screenprecisa mais do que um terminal idiota.
rekado

Respostas: