从Emacs内部远程连接ssh

时间:2012-05-08 08:49:28

标签: emacs ssh

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

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

(而不是投票结束,可能会将问题迁移到另一个网站。)

修改:相关讨论here

4 个答案:

答案 0 :(得分: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*")))

或者这可能是更好的选择:

(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-h f term-mode RET

答案 1 :(得分:3)

事实证明,有你想要的东西:

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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