几个问题,包括this一,从 Emacs 中讨论与 ssh 连接相关的方面。不过,我还没有找到我的问题的答案:如何从 Emacs 中通过 ssh 连接到远程机器?
我不想在 Emacs 中编辑远程机器上的文件。我知道 M-x
shell
它在我的本地机器上打开一个 shell,我知道使用 TRAMP 在远程机器上通过 ssh 编辑文件。然而,这些都与这个问题无关。
(与其投票结束,不如将问题迁移到另一个站点。)
编辑:相关讨论here .
最佳答案
首先,我不知道 native 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")
返回 (info "(emacs) Terminal Mode")
返回 term-mode
返回 关于emacs - Emacs 中的远程 ssh 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10495432/