从Emacs内部远程连接ssh

Sab*_*lfy 7 emacs ssh

包括一个在内的几个问题讨论了与Emacs内部的ssh连接相关的方面.我没有找到我的问题的答案:如何从Emacs内部进入远程机器?

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

(而不是投票关闭,可能将问题迁移到另一个站点.)

编辑:这里的相关讨论.

phi*_*ils 10

首先,我不知道本机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*")))
Run Code Online (Sandbox Code Playgroud)

或者这可能是最好的:

(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*")))
Run Code Online (Sandbox Code Playgroud)

显然还有改进的余地,但我认为这是非常有用的.

你应该确保你熟悉它的怪癖term-mode.看到:

  • M-: (info "(emacs) Terminal emulator") RET
  • M-: (info "(emacs) Terminal Mode") RET
  • C-hf term-mode RET