我该如何使用Emacs Tramp实现SSH双跳?

33

我的校园只允许通过网关服务器进行ssh访问。所以要访问我正在编码的集群,我必须先ssh到网关,然后再ssh到我正在使用的机器上。有时连接非常慢,很难工作。

我希望能使用像tramp这样的工具,据我了解,它会在本地打开缓冲区,并且只在保存到磁盘时才通过网络进行通信。

但是我对tramp并不熟悉,尤其是通过双跳方式。文档说可以通过在tramp中定义代理来实现,但我无法理解语法。

有人知道如何使用emacs通过双跳方式编码,或者有其他的解决办法来通过两个ssh跳跃进行代码编辑吗?


1
如果您能解释一下关于文档http://www.gnu.org/software/tramp/#Multi_002dhops的具体不理解之处,那可能会有所帮助。 - Jouni K. Seppänen
5个回答

31

至少从Emacs 24开始,它们有一个新版本的multi,您可以像这样打开路径:

   /ssh:bird@bastion|ssh:you@remotehost:/path

我可以确认在我的Emacs 24.3.1版本中这个方法是有效的。文档在这里有介绍。


使用 su:sudo: 方法时,还要注意使用此语法可能存在的陷阱:https://dev59.com/53I95IYBdhLWcg3wvgh9#16408592 - phils
确认在 macOS 11.1 上的 Emacs 26.1 上工作。 - JS.

21
如果您使用的是Emacs 24.3或更高版本,请参阅Joe的答案,以获取下面所述配置的替代方案。如果您将多次使用此双跳功能,则可以修改tramp-default-proxies-alist或将tramp-save-ad-hoc-proxies设置为t
如果您使用的是Emacs 23.1或更高版本,则不再支持multi方法。您可以通过配置“代理”来实现相同的结果。
在您的.emacs配置文件中添加以下内容:
(add-to-list 'tramp-default-proxies-alist
                 '("HOSTB" nil "/ssh:USERA@HOSTA:"))

HOSTB是HOSTA后面的目标主机。

然后输入/ssh:USERB@HOSTB:,emacs会提示输入HOSTA密码和HOSTB密码。


2
有什么想法为什么multi被移除了?它太棒了 :( - David Gardner
1
我相信汤姆指出的是功能性仍然存在,只是以不同的形式呈现。很遗憾它变得更难以临时处理,但它并没有消失。 - Brighid McDonnell
7
在Emacs 24中,你可以使用管道符号,例如:/ssh:bird@bastion|ssh:you@remotehost:/path(参见文档:http://www.gnu.org/software/tramp/#Ad_002dhoc-multi_002dhops)。 - Joseph Lisee
它能否通过密码进行一次跳跃认证,而通过私钥进行另一次认证? - Vladimir Protsenko

12

你应该使用 SSH 进行双跳。在你的 .ssh/config 文件中:

Host <host that must be proxied too>
ProxyCommand ssh -qxT <gateway host> nc %h %p

我从未让它正常工作过。我刚试了一下,它提示我输入网关密码并显示: “ssh_exchange_identification: Connection closed by remote host” 然后就退出了。 - f4hy
请注意,跳板机上需要安装netcat。但是,您应该能够自己编译它并将其保存在~/bin/中。您可能需要在proxycommand中放入完整路径(... /home/yourname/bin/nc %h %p)。 - Benson
1
哦,记住如果你已经设置了密钥,这将是最好的方案,不然你会频繁输入密码(例如每次登录输入两次)。 - Benson
是的,这对我的其他应用程序有效,但在Emacs 29上无法工作... - Jacob Lee

4
在早期的Emacs版本中,Tramp有一个multi方法。在GNU Emacs 22及以下版本中,您可以像这样使用它:
/multi:ssh:user1@host1:ssh:user2@host2:/foo/bar/baz

host2上打开/foo/bar/baz。在XEmacs上也可以做到同样的事情,但语法略有不同。您也可以使用不同的访问方法。


多行编辑在我的电脑上无法使用。Emacs 的最新版本中不是已经移除了它吗? - David Gardner
多久以前的版本?我在Debian/unstable系统上使用的是Emacs 22.3,它运行得很好。 - hillu
他们取消了支持。我在GNU Emacs 23.2.1(i686-pc-cygwin,GTK+版本2.18.6)上尝试了一下,结果得到了以下信息:“tramp-dissect-file-name: `multi' method is no longer supported, see (info "(tramp)Multi-hops")。” - User1

1
使用@fuzzy-waffle的想法,完整的配置如下:

完整的配置如下:

Host servera
  Hostname servera.lan.local
  User servera-user
  ProxyCommand ssh gateway-server -W %h:%p

将您的~/.ssh/id_rsa.pub~/.ssh/id_ed25519.pub添加到servera上的~/.ssh/known_keys中。
最后,您可以运行C-x C-f /ssh:servera:~/abc.txt

我已经在终端和其他应用程序中设置好了这个,并且它也可以工作,但是Emacs仍然两次提示我输入密码... - Jacob Lee
你在Emacs中是否有特定于tramp的配置?或者是特定于ssh的配置?尝试将它们移除? - Vasantha Ganesh
没有特定于tramp或ssh的配置;无论如何,在使用-q选项启动后,我都会得到相同的行为。使用终端进行ssh登录时,我没有任何问题;当我使用Sequel Ace时也是一样的。 - Jacob Lee
我想不出任何问题,你是否使用了一种特殊的操作系统,它使用某种监狱/沙盒技术? - Vasantha Ganesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接