使用eshell / TRAMP / dtach附加到运行中的远程Shell


11

我经常使用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一起使用。


shell模式与shell进程(eshell即shell)进行交互,因此从概念上讲,您似乎无法做自己想要做的事情,除非您在dtach会话中使用eshell缓冲区访问正在运行的emacs。还是我在这里弄错了?
汤姆·雷格纳

eshell本地与远程之间以及外部命令与elisp功能之间的界限模糊了。我想使它更加模糊,以便远程运行的进程可以透明地交互,就好像它们是本地的一样。我认为,这几乎与“恢复”正在运行的会话相同。
rekado 2014年


@sds:在screen内部运行shell-mode无法正常工作,因为screen需要的不仅仅是哑终端。
rekado 2014年

Answers:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.