我有一个关于 SSH X11 转发和端口转发的问题。
我有:
- 2 台运行 Ubuntu Desktop 的计算机(不在同一位置和本地网络)
Desktop1
使用 IP 地址进行调用IP1
,另一个是Desktop2
,IP2
。 - 和 1 个带有 IP 地址的 VPS(Ubuntu 服务器)
IP_VPS
。
D1 <------> VPS <------> D2
在 中Desktop1
,我运行了这个命令:
ssh -XC -R 8022:localhost:22 vps_user@IP_VPS
然后,我运行这些命令Desktop2
:
ssh -XC vps_user@IP_VPS
在连接的 SSH shell 上,我运行了:
ssh -XC desktop_user@localhost -p 8022
(目的是连接到Desktop1
from Desktop2
via VPS
)
我连接Desktop1
成功了。但是,当我尝试在连接的 SSH shell 上运行 GUI 应用程序(例如:)时gedit
,该窗口没有出现在 中,Desktop2
而是出现在 中Desktop1
。我预计它会被转发到Desktop2
。
请向我解释一下我是否误解了什么?多谢!
答案1
Ubuntu 可能使用 Wayland 而不是 X11,这将使 X11 转发不适用。
由于 Desktop1 上的命令的目的ssh
只是建立远程到本地端口转发以允许将来的入站连接,因此您根本不需要该连接上的 X11 转发选项。但这应该不会造成任何伤害。
否则,您的命令看起来基本上是正确的:X11 应用程序应该在 Desktop2 上显示其窗口或报告$DISPLAY
未定义的错误。
唯一的办法是X11如果DISPLAY=:0
在启动 X11 应用程序之前在 Desktop1 上明确设置了某些内容,则在 VPS->Desktop1 上启动的 GUI 应用程序将显示在 Desktop1 本身上。 (因为desktop_user@Desktop1
可能已经为第一个 SSH 连接打开了本地 GUI 会话,所以desktop_user 已经为本地 X11 显示提供了有效的会话 cookie。)
但这只是事实如果 Desktop1 实际上首先配置为使用 X11。 Ubuntu 的 GNOME 桌面可能正在使用 Wayland,这完全切断了 X11 协议:如果gedit
使用 Wayland 协议而不是 X11,那么该DISPLAY
变量对它来说就没有意义,而是会显示在 Desktop1 的本地显示器上。
我知道在 Wayland 中,客户端、显示合成器(最接近的 X11 服务器)和内核/显示硬件之间的共享内存缓冲区不是可选的,因此 Wayland 协议不允许像 X11 那样远程处理应用程序。 VNC 或 RDP 等 GUI 远程处理解决方案可以在 Wayland 上单独实施。
也许使用实际的仅 X11 应用程序进行测试,例如xterm
?或者将 Desktop1 上的 GUI 配置为仅 X11 模式,方法是#WaylandEnable=false
在 中找到注释掉的行/etc/gdm3/custom.conf
,取消注释,然后重新启动 Desktop1。
(有关在 Ubuntu 上禁用 Wayland 的更多信息:https://linuxconfig.org/how-to-enable-disable-wayland-on-ubuntu-22-04-desktop)