gpt4 book ai didi

emacs - Emacs 中的远程 ssh 连接

转载 作者:行者123 更新时间:2023-12-04 10:05:08 28 4
gpt4 key购买 nike

几个问题,包括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 的怪癖。 .看:
  • M-:(info "(emacs) Terminal emulator")返回
  • M-:(info "(emacs) Terminal Mode")返回
  • 高频term-mode返回
  • 关于emacs - Emacs 中的远程 ssh 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10495432/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com