包括这个问题在内的几个问题讨论了与 Emacs 中的 ssh 连接相关的方面。不过,我还没有找到我的问题的答案:如何从 Emacs 中通过 ssh 连接到远程机器?
我不想在 Emacs 中编辑远程机器上的文件。我知道M-x
shell
哪个会在我的本地机器上打开一个 shell,并且我知道使用 TRAMP 在远程机器上通过 ssh 编辑文件。但是,这些都与这个问题无关。
(而不是投票关闭,也许将问题迁移到另一个站点。)
编辑:相关讨论在这里。
首先,我不知道有一个原生的 elisp ssh 客户端(并且不认为有很大的动机去写一个),所以你肯定需要与一个外部的 ssh 客户端进程进行交互。
由于您希望以交互方式使用 ssh ,因此 ssh 进程需要连接本地端的终端。
因此问题就变成了:Emacs 是否实现了一个可以附加 ssh 进程的终端?
答案是:是的——term.el 提供了一个健壮的终端实现,通过它可以直接运行 ssh,而不需要 shell。
如果您运行M-x term
RET,系统将提示您输入程序。(它默认为 shell,但这肯定不是您可以运行的唯一类型的进程。)
由于未知的原因,交互式term
(和ansi-term
)函数不支持将参数传递给指定的程序,如果您希望运行类似ssh user@host
. 您可以改为指定一个处理参数的脚本,但我们也可以在 elisp 中管理它:
该term
函数实际上是一个简单的包装器,它调用make-term
以启动程序,然后设置适当的模式。正如接受make-term
程序参数一样,复制和修改 的定义term
以适合您自己的目的非常简单。
这是一个非常简单的实现:
(defun my-ssh (user host port)
"Connect to a remote host by SSH."
(interactive "sUser: \nsHost: \nsPort (default 22): ")
(let* ((port (if (equal port "") "22" port))
(switches (list host "-l" user "-p" port)))
(set-buffer (apply 'make-term "ssh" "ssh" nil switches))
(term-mode)
(term-char-mode)
(switch-to-buffer "*ssh*")))
或者也许这是更可取的:
(defun my-ssh (args)
"Connect to a remote host by SSH."
(interactive "sssh ")
(let ((switches (split-string-and-unquote args)))
(set-buffer (apply 'make-term "ssh" "ssh" nil switches))
(term-mode)
(term-char-mode)
(switch-to-buffer "*ssh*")))
显然还有改进的余地,但我认为这是相当有用的。
您应该确保熟悉term-mode
. 看:
(info "(emacs) Terminal emulator")
RET(info "(emacs) Terminal Mode")
RETterm-mode
RET事实证明,有你想要的:
(setq rlogin-program "ssh")
(setq rlogin-process-connection-type t)
然后M-x rlogin RET <myhost> RET
会这样做。
也许ssh.el是您正在寻找的。ssh 命令提供了一种通过 ssh 在 Emacs 中创建远程 shell 的单步方式,包括以自然方式指定用户名,并在需要时启用tramp 目录跟踪。
我不确定我是否理解。打开M-x ansi-term
并在ssh user@host
那里运行?