使用Emacs和Tramp通过网关到达远程主机

使用Emacs和Tramp通过网关到达远程主机,emacs,ssh,elisp,tramp,Emacs,Ssh,Elisp,Tramp,我试图在Emacs中编辑一个远程文件,但在做我想做的事情时遇到了麻烦 我正在从不同的位置远程工作,我想在服务器Foo上编辑文件。无法从Internet直接访问服务器Foo,但服务器Bar可以,并且Foo接受来自Bar的连接。我可以指望到达酒吧,酒吧也可以指望到达福 Tramp文档告诉我,我需要将其添加到Tramp的代理列表中才能执行此操作,它应该如下所示: (add-to-list 'tramp-default-proxies-alist ("foo_host" "seanm" "/ss

我试图在Emacs中编辑一个远程文件,但在做我想做的事情时遇到了麻烦

我正在从不同的位置远程工作,我想在服务器Foo上编辑文件。无法从Internet直接访问服务器Foo,但服务器Bar可以,并且Foo接受来自Bar的连接。我可以指望到达酒吧,酒吧也可以指望到达福

Tramp文档告诉我,我需要将其添加到Tramp的代理列表中才能执行此操作,它应该如下所示:

(add-to-list 'tramp-default-proxies-alist
    ("foo_host" "seanm" "/ssh:seanm@bar_host"))
然而,当我尝试这样做时,它不起作用,我得到了难以理解的错误消息

  • 我怎样才能明确地提到Foo?没有DNS服务器知道如何从其主机名查找Foo,并且Foo的IP地址位于10.0.0.0/8专用空间中。我不想通过那个IP地址来引用Foo,因为这可能会与我可能访问的其他10.0.0.0/8网络中的主机发生冲突。作为一个难题,我将Foo添加到Bar的/etc/hosts文件中,但这似乎不起作用。有更好的解决办法吗

  • 我需要遵守哪些报价规则?我看到的示例使用了“双引号”和“勾号和单引号”,后者显然需要双反斜杠转义。我不明白那里发生了什么-看起来这个字符串将要经过多个层次的解析

  • 在尝试这方面的变化时,我收到了相当于“您不能在该场景中使用该远程访问方法”的错误消息。我如何设置第二个代理方法,使我能够执行与C-x C-f
    /su::/path/to/file

与以前的多跳语法相比,这一切似乎都非常痛苦


后来:我能够正确地进行多层转义,以便emacs正确地“听到”主机名。但是,我无法在一秒钟之外获得任何跳数来正常工作,这是一个非常令人失望的功能性失误。

正确的答案是使用Host、HostAlias和ProxyCommand指令修改我的SSH配置。

虽然这是可能的IIRC,但另一种方法是配置SSH以通过Bar到达Foo。对于OpenSSH,使用带有
ProxyCommand
选项的
Host
别名;您将在或上找到大量示例。这对第一个和第二个问题非常有帮助,但它似乎无助于复制
/su::/path/to/file
的功能。原则上,我应该能够在elisp中完成整个操作。为什么不包括“难以理解的错误消息”?