emacs - Emacs 中的远程 ssh 连接

标签 emacs ssh

几个问题,包括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/

    相关文章:

    git push 显示错误的用户名

    azure - 无法连接到使用 Azure Powershell 创建的 Azure 虚拟机

    mysql 通过 ssh 授予权限

    emacs - emacs 中的文档 View : refreshing dvi content automatically

    emacs - 如何在 Emacs 中为一系列命令设置单个键绑定(bind)

    python - Emacs 设置行内(行尾)注释的间距

    git - SmartGit 不会使用 ssh 进行身份验证

    c++ - 作为变量的 Symbol 的值是 void :company-c-headers

    emacs - 如何在不更改 TAB 的情况下将命令绑定(bind)到 C-i?

    ruby - 使用 Ruby 通过网关连接到远程数据库