如何通过其他服务器启用SSH X11转发?


33

我有主机A,B和C。从主机AI只能通过ssh进行访问。从BI可以访问C。我希望能够在C上运行X11程序并将显示转发给A。

我尝试了这个:

A $ ssh -XB
B $ ssh -XC
加元xclock
错误:无法打开显示:

但这是行不通的。

Answers:


25

有几种方法可以做到这一点,我更喜欢的是转发ssh端口:

首先,连接到计算机B并通过B将[localPort]转发到C:22

A$ ssh -L [localPort]:C:22 B

接下来,使用[localPort]通过新创建的隧道从A连接到C,转发X11

A$ ssh -X -p [localPort] localhost

现在我们可以在C上运行X11程序,并在A上显示它们

C$ xclock

[localPort]可以是您尚未在A上收听的任何端口,为简单起见,我经常使用2222。


3
不完全正确...如果在服务器C上未启用X11Forwarding,它将无法正常工作。除非在服务器B上设置AllowTcpForwarding yes和GatewayPorts yes,否则它也将不起作用。此答案完全不可接受
asdmin

您的观点很不错,我没有注意到这一点,因为我使用的是debian,默认情况下已在其上启用X11Forwarding和AllowTcpForwarding。不需要GatewayPorts,因为当禁用它时,SSH仍然在localhost上侦听,这就是我们正在连接的内容。仅当您想通过外部IP为机器A建立第二个连接时,才需要它
。– dave

在步骤1中,它没有询问我主机B的密码,而我最终在主机C中建立了连接。在另一个窗口中,我尝试了步骤2,并得到“ ssh_exchange_identification:远程主机关闭了连接”。
msb

ssh:连接到主机...端口22:执行第一个命令时拒绝连接
Rodrigo

7

使用端口转发可以轻松实现:

A$ ssh -NL 2022:C:22 B &
A$ ssh -X -p 2022 localhost
C$ xclock

端口localhost:2022通过B转发到C:22 SSH通过localhost:2022到C


2
如果在B(网关)没有启用正确的sshd转发选项的情况下,由于其他地方提到的相同原因,此方法将不起作用。
g33kz0r

没有要求我提供密码给主机B,这很奇怪;并且它不起作用,我收到错误消息“通道2:打开失败:管理员禁止:打开失败ssh_exchange_identification:连接被远程主机关闭”
msb

4

假设问题是中间计算机没有X,但是将其配置为允许转发X11,只需安装xauth。

在基于yum的系统(fedora,redhat,centos)上:

B$ sudo yum install xauth

在基于apt的系统上(debian,ubuntu):

B$ sudo apt-get install xauth

是的-非常适合无头覆盆子pi。
cmc

@cmc或像VPN一样使用ssh。
Jayen

@cmc你有yumPI吗?
Jayen

nope-sudo apt-get install xauth
cmc

3

对于新版本的opensshd,您必须先禁用X11UseLocalhost它才能起作用。

您需要在主机C上执行此操作,/etc/ssh/sshd_config然后重新启动sshd才能起作用:

X11Forwarding yes
X11UseLocalhost no

2

如果在使用的任何sshd中禁用了X11Forwarding,则无法转发X11显示。

人sshd_config:

X11Forwarding
  Specifies whether X11 forwarding is permitted. The argument must be “yes”
  or “no”.  The default is “no”.

您必须确保在目标所有正在使用的中间sshds 上启用了X11Forwarding。

只是一个小提示:您应该尝试使用VNC,X11显示转发非常消耗带宽。


@AgentK和@dave的建议仅要求在最终主机上启用X11Forwarding,因为它们使用SSH隧道绕过中间主机。您的建议几乎肯定是为什么OP的方法最初失败的原因,但这并不意味着其他人的回答“是不可接受的”
Daniel Lawson

他们的答案是有缺陷的,并纠正了问题,没有解决。一个正确而有用的答案将考虑并解决原始问题,并仅在原始问题无法解决的情况下提供其他方式。顺便说一句,他们俩都没有提到X11Forwarding,这是必不可少的
asdmin

在某些系统上,默认值为“ yes”。
布拉德·吉尔伯特

我检查了X11Forwarding是否在B和C上启用,并且AllowTcpForwarding在B上设置为yes。但是命令的结果是相同的。戴夫的答案对我来说很好。
lexsys

然后这样做,但这只是一种补救措施。您还可以从参数'-v'开始ssh,或尝试回显$ DISPLAY所有嵌套的ssh命令以找出丢失$ DISPLAY的位置
2009年

2

如果您经常从A转到C,则可以将B配置为代理:

A:~/.ssh/config

Host C
  ForwardX11   yes
  ProxyCommand ssh -W %h:%p B

那就是

A$ ssh C xclock

1

你试过了吗

A$ ssh -Y B
B$ ssh -Y C
C$ xlclock

-Y标志“启用受信任的X11转发”。


相同的结果。
lexsys

这为我工作,但只发现如何慢是X11
罗德里戈
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.