我的情况是这样的:我在学校当技术员。我们的一个服务器有防火墙问题,无法接受来自网络外部的连接。
我尝试通过 SSH 连接到其中一台正常运行的服务器,然后使用 Mac 的终端通过 SSH 连接到有问题的服务器:
ssh -X11 -2 [email protected] # runs some Linux (don't remember which distro)
ssh -X11 -2 [email protected] # runs Ubuntu 11.04
如果我尝试运行 nautilus,我会连续四次收到“由于身份验证错误,X11 连接被拒绝。”,然后收到“无法解析参数:无法打开显示:”
我可以等待 IT 部门修复防火墙问题,但我有一些工作需要完成,越快越好,而使用命令行会使速度变慢很多。
旁注:我认为 goodserver 没有安装 X11。
答案1
你能这样做,但不要按照你的想法去做。你想要做的是使用 SSHProxyCommand
配置选项(参见ssh_config
(5) 中的示例)来允许你从本地计算机直接建立到目的地的 SSH 连接,将 SSH 连接隧道化到一个或多个其他连接中。你不是在建立多个“跳跃”,而是建立一系列隧道。
答案2
使用代理命令就像 @womble 告诉你的那样。对我来说,另一种方法也有效。我还需要偶尔从另一台服务器后面的计算机运行远程 X 程序,所以我需要从我的笔记本电脑连接到服务器,然后从那里连接到我的最终目的地。我这样做:
ssh -YC me@myserver
然后从服务器
ssh -YC me@myanothercomputer
所以我使用-YC
而不是-X
。即使-C
不是必需的,它只是压缩,如果我的连接速度很慢,它会对我有所帮助。
答案3
旁注:我认为 goodserver 没有安装 X11。
我认为这就是问题所在 -ssh -X
将尝试将任何远程传入的 X 连接转发到本地 X 服务器,如果没有本地 X 库等,这似乎是不可能的。(可能是 SSH 实际上使用 X 库进行 cookie 重写。)
我刚刚尝试了您的命令,它运行良好 - 但这里中间服务器也有 X 二进制文件。(但它没有监视器。)
因此,请使用 womble 的建议:使用一个 SSH 连接goodserver
,在此连接中创建一个隧道,然后通过此隧道运行第二个连接。(我通常使用 Java 的 JSch SSH 客户端库执行此操作,但也可以采用命令行 SSH。)
ssh -L localhost:2222:badserver:22 -N root@goodserver &
ssh -X -p 2222 root@localhost
-o NoHostAuthenticationForLocalHost=yes
如果您的已知主机文件中已经存储了另一个 localhost 密钥,则可能需要第二条命令来避免 SSH 客户端发出嚎叫声。