我经常使用GNU Screen使远程会话保持活动状态。由于我住在Emacs中,因此我非常希望能够从Emacs中恢复正在运行的远程Shell会话。
GNU Screen实现了我真正不需要的各种奇特功能,例如终端多路复用和字符绘制。我真的只对拥有可分离和可恢复的shell会话感兴趣,所以简单的事情dtach
就足够了。
我正在使用此功能来打开SSH会话并重新连接到的运行dtach
会话shell-mode
(从此处获取):
(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))))
尽管有一些小怪癖,但这对于几乎可以用shell-mode
,但是在Eshell中,这仅启动了一个子进程,因此终端变得非常有限(例如,没有路径自动完成)。
dtach
连接到远程服务器后,如何配置Eshell以连接到正在运行的会话?
编辑: 当我再次考虑这个问题时,我意识到尚不清楚我真正想要的是什么。清单:
- 我想留在eshell中,而不是在某些子过程中
- 重新连接后,我希望重播远程会话的输出并且远程命令历史记录可用
- 我希望能够与正在运行的远程进程进行交互(例如正在
yum install
等待我的输入)
看来我需要编写一些elisp代码才能使所有这些与dtach一起使用。
在
—
rekado 2014年
eshell
本地与远程之间以及外部命令与elisp功能之间的界限模糊了。我想使它更加模糊,以便远程运行的进程可以透明地交互,就好像它们是本地的一样。我认为,这几乎与“恢复”正在运行的会话相同。
@sds:在
—
rekado 2014年
screen
内部运行shell-mode
无法正常工作,因为screen
需要的不仅仅是哑终端。
eshell
即shell)进行交互,因此从概念上讲,您似乎无法做自己想要做的事情,除非您在dtach会话中使用eshell缓冲区访问正在运行的emacs。还是我在这里弄错了?