包括this一个问题在内的几个问题讨论了与Emacs内部的ssh连接相关的方面。我没有找到我的问题的答案:如何从Emacs内部进入远程计算机?
我不希望在Emacs中编辑远程计算机上的文件。我知道M-x
shell
在我的本地机器上打开一个shell,我知道使用TRAMP在远程机器上通过ssh编辑文件。但是,这些都与这个问题无关。
(而不是投票结束,可能会将问题迁移到另一个网站。)
修改:相关讨论here。
答案 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
的怪癖。参见:
(info "(emacs) Terminal emulator")
RET (info "(emacs) Terminal Mode")
RET 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