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 dtach
possa ser suficiente.
Estou usando esta função para abrir uma sessão SSH e reconectar-se a uma dtach
sessã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 dtach
sessã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 install
aguardando minha entrada)
Parece que vou precisar escrever um pouco de código elisp para fazer tudo funcionar com o dtach.
eshell
linhas 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.
screen
dentro dele shell-mode
não vai funcionar bem, porque screen
precisa mais do que um terminal idiota.
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?