Emacs Tramp ssh双跳

5

请问有人可以帮我设置Emacs Tramp以进行双跳吗? 我想在machine2.abc.def.edu上工作,但只能通过machine1.abc.def.edu连接。我的用户名是myname,在两台机器上都相同。

我尝试添加.emacs:

(add-to-list 'tramp-default-proxies-alist
          '("\\`machine2\\.abc\\.def\\.edu\\'"
            "\\`myname\\'"
            "/ssh:machine1\\.abc\\.def\\.edu:"))

这是我对手册内容的最佳猜测解释。然后我执行: C-x C-f /ssh:machine2.abc.def.edu 或者: C-x C-f /ssh:rsuhada@machine2.abc.def.edu
但两者都会出现以下情况:
ssh: Could not resolve hostname ssh: nodename nor servname provided, or not known
Process *tramp/scpc ssh* exited abnormally with code 255

我使用的Aquamacs无法退出,必须从shell中终止它...这里有一个两年前的帖子提出了相同的问题。我已经尝试过那里的答案:

(add-to-list 'tramp-default-proxies-alist
          '("machine2.abc.def.edu"
            nil
            "/ssh:myname@machine1.abc.def.edu:"))

对于我能想到的所有组合,结果都相同......但在machine1.abc.def.edu上进行远程编辑是可以正常工作的。


看起来与https://dev59.com/fXRB5IYBdhLWcg3wHkPi有关,但不确定是否回答了你的问题。 - vpit3833
是的,这正是我在我的帖子中提到的帖子(即解决方案2)。它对我不起作用... netcat解决方案对我也不可行... - user673592
你可能想要自定义 tramp-verbose 变量,以查看是否可以获得更多信息。 - phils
3个回答

10
使用ssh_config中可用的ssh_proxy命令即可解决问题。文档可以在这里这里找到。基本上,您需要在ssh文件夹中创建一个配置文件,并在其中编写快捷方式。其中一个快捷方式是通过另一个端点使用代理。所有快捷方式都适用于任何使用ssh的工具,包括git和emacs。
Host endpoint2
     User myusername
     HostName mysite.com
     Port 3000
     ProxyCommand ssh endpoint1 nc -w300 %h %p

Host endpoint1
     User somename
     HostName otherdomainorip.com
     Port 6893

在这个例子中,运行ssh endpoint2将自动通过endpoint1进行跳转。

以上解决方案可行,所以我还没有尝试过,但非常感谢您的回复。也许将来会有用! - user673592
注意:在endpoint1示例中,我不得不使用“User”而不是“Username”,并且我必须同时使用“HostName”而不是“Host”。 - Jack

4

好的,那么我们尝试一些不同的东西,而不是打开一个隧道。你的.emacs文件中可以尝试以下内容:

(add-to-list 'tramp-default-proxies-alist 
             '("\\`machine2\\'" 
               nil 
               "/ssh:%u@machine1.abc.def.edu:"))

以下代码与您在论坛帖子中找到的代码有两点不同:

  1. 它在目标主机名周围添加了引号(Emacs正则表达式语法,以避免匹配部分名称)
  2. 它仅使用目标主机中的子域名(您在下面的评论中报告说当您使用完整的域名时无法ssh到machine2)

这样做是否有助于您访问machine2上的文件?


2
哇!它起作用了!!!非常感谢Thomas!我觉得难以置信,这里有人愿意并且能够帮助陌生人!:) 非常非常感谢。为了后代,如果有人遇到类似的问题:要登录:C-x C-f myname@machine2(即没有域名)。 - user673592
非常好!(我认为这可能是特定于您的本地设置)。 - Thomas

2

在假设机器2的sshd运行在22端口的情况下,从机器1到机器2建立一个ssh隧道:

machine1.abc.def.edu> ssh -f -N -L 2222:localhost:22 machine2.abc.def.edu

然后像这样从Emacs连接到machine2:

/ssh:machine1.abc.def.edu#2222

或者将以下行添加到您的 .emacs 文件中:
(add-to-list 'tramp-default-proxies-alist
             '("\\`machine2\\.abc\\.def\\.edu\\'" nil
               "/tunnel:machine1.abc.def.edu#2222:"))

谢谢,但这仍然出现相同的错误。我已经检查了端口,确实是22。尝试了/ssh:和将片段添加到.emacs中-没有成功... - user673592
那太糟糕了!你能否通过运行 ssh -p 2222 machine1.abc.def.edu 从 shell 连接到 machine2 吗? - Thomas
不...虽然我有点困惑,你的意思是:在我的笔记本电脑上,ssh -p 2222 machine1.abc.def.edu 和 ssh -p 2222 machine2.abc.def.edu 都显示“连接被拒绝”。ssh machine1.abc.def.edu 可以正常工作。 - user673592
我注意到你在原始回复中添加了-f -L标志。但这对我不起作用。唯一有效的方法是:machine1.abc.def.edu> ssh -L 2222:localhost:22 machine2 - 即如果我添加域名.abc.def.edu,它会报错("uudecode失败"),如果我添加其他标志也是如此。 - user673592
我已经添加了“-f -N”,但它们是可选的。machine1在防火墙后面吗?看起来您可以访问machine1上的22端口,但无法访问2222端口... 为了明确起见,我的意思是您首先登录machine1并使用ssh -L 2222:localhost:22 machine2建立隧道。然后从你的笔记本电脑上尝试使用ssh -p 2222 machine1.abc.def.edu - Thomas
好的,是的,这正是我所想/做的。不确定防火墙是否可以通过,但可能是可以的……我无法访问这两台计算机的root权限,并且通常情况下不想设置隧道。我认为tramp的代理方法应该能够处理这个问题…… - user673592

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