Uso spesso lo schermo GNU per mantenere attive le sessioni remote. Dal momento che vivo in Emacs, mi piacerebbe davvero poter riprendere una sessione di shell remota in esecuzione all'interno di Emacs.
Lo schermo GNU implementa ogni sorta di cose fantasiose come il multiplexing terminale e il disegno dei personaggi di cui non ho davvero bisogno. Sono davvero interessato solo ad avere sessioni di shell staccabili e ripristinabili, quindi qualcosa di semplice come dtachpotrebbe essere sufficiente.
Sto usando questa funzione per aprire una sessione SSH e riconnettermi a una dtachsessione in esecuzione shell-mode(presa da qui ):
(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))))
Nonostante le piccole stranezze, questo funziona quasi bene shell-mode, ma in Eshell questo avvia solo un sottoprocesso, quindi il terminale diventa molto limitato (ad esempio nessun completamento automatico del percorso).
Come posso configurare Eshell per connettersi a una dtachsessione in esecuzione al momento della connessione a un server remoto?
EDIT: Mentre ripensavo a questo problema, mi sono reso conto che non è del tutto chiaro quello che voglio davvero. Ecco un elenco:
- Voglio rimanere in eshell, non in alcuni sottoprocessi
- dopo il ricollegamento, desidero riprodurre l'output della sessione remota e rendere disponibile la cronologia dei comandi remoti
- Voglio essere in grado di interagire con un processo remoto in esecuzione (ad esempio una corsa in
yum installattesa del mio input)
Sembra che dovrò scrivere un po 'di codice elisp per far funzionare tutto con dtach.
eshelllinee tra ciò che è locale e ciò che è remoto e ciò che è un comando esterno e una funzione elisp sono sfocate. Vorrei renderlo ancora più fuzzato in modo tale che i processi in esecuzione remoti possano interagire in modo trasparente come se fossero locali. Sarebbe quasi lo stesso di "riprendere" una sessione di corsa, credo.
screenall'interno di shell-modenon funzionerà bene, perché ha screenbisogno di più di un terminale stupido.
eshellÈ la shell - quindi concettualmente mi sembra che tu non possa fare quello che vuoi, a meno che tu non acceda ad un emacs in esecuzione con un buffer eshell nella sessione dtach. O mi sbaglio qui?