7

包括这个问题在内的几个问题讨论了与 Emacs 中的 ssh 连接相关的方面。不过,我还没有找到我的问题的答案:如何从 Emacs 中通过 ssh 连接到远程机器?

我不想在 Emacs 中编辑远程机器上的文件。我知道M-x shell哪个会在我的本地机器上打开一个 shell,并且我知道使用 TRAMP 在远程机器上通过 ssh 编辑文件。但是,这些都与这个问题无关。

(而不是投票关闭,也许将问题迁移到另一个站点。)

编辑:相关讨论在这里

4

4 回答 4

11

首先,我不知道有一个原生的 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. 看:

  • M-: (info "(emacs) Terminal emulator") RET
  • M-: (info "(emacs) Terminal Mode") RET
  • C-hf term-mode RET
于 2012-05-10T15:00:11.253 回答
4

事实证明,有你想要的:

(setq rlogin-program "ssh")
(setq rlogin-process-connection-type t)

然后M-x rlogin RET <myhost> RET会这样做。

于 2012-05-11T12:38:50.093 回答
2

也许ssh.el是您正在寻找的。ssh 命令提供了一种通过 ssh 在 Emacs 中创建远程 shell 的单步方式,包括以自然方式指定用户名,并在需要时启用tramp 目录跟踪。

于 2012-08-07T18:16:20.193 回答
1

我不确定我是否理解。打开M-x ansi-term并在ssh user@host那里运行?

于 2012-05-08T08:51:29.787 回答