我知道这个问题有很多变化,但我找不到针对这种情况的解决方案。
设置:本地计算机、远程计算机(在同一本地网络上)。在本地计算机(Ubuntu 20.04)上,我有以下几行~/.ssh/config
:
Host remote
User username
HostName remote.local
Port 223
ForwardX11 yes
ForwardX11Trusted yes
在远程计算机(Ubuntu 22.04)上,我有以下几行/etc/ssh/sshd_config
:
Port 223
X11Forwarding yes
X11DisplayOffset 10
(当然,端口并不重要)。我通过连接ssh remote
,并且没有任何问题。该DISPLAY
变量被设置(良好)为localhost:11.0
(也许有时设置为localhost:10.0
)。当我运行xclock
或 时xlogo
,我看到它很好。工作完美。
但问题是:每当我运行几乎所有其他 GUI 应用程序时,它都不起作用。有时,错误会被打印出来,有时,它们会静静地失败。例子:
- 跑步
eog picture.png
悄然失败。我没有看到任何消息,也没有看到图片。 - 运行时
evince
,我看不到 PDF,并且看到重复的错误消息:gdk_monitor_get_scale_factor: assertion 'GDK_IS_MONITOR (monitor)' failed
。gnome-calculator
失败并出现类似错误。 - 运行
firefox
失败(我看不到浏览器,即使该进程之前不存在),并且我看到重复的错误消息:X11 connection rejected because of wrong authentication.
- 断开连接并重新连接后第二次运行
firefox
,错误消息已更改:Error: cannot open display: localhost:11.0
。
此时,我有点失落。
我还以详细模式进行连接,以寻找有趣的问题。我发现的唯一可能相关的行是
debug1: Remote: /home/username/.ssh/authorized_keys:1: key options: agent-forwarding port-forwarding pty user-rc x11-forwarding
debug1: Remote: /home/username/.ssh/authorized_keys:1: key options: agent-forwarding port-forwarding pty user-rc x11-forwarding
debug2: channel_input_open_confirmation: channel 0: callback start
debug2: x11_get_proto: /usr/bin/xauth list :0 2>/dev/null
debug1: Requesting X11 forwarding with authentication spoofing.
debug2: channel 0: request x11-req confirm 1
看起来不错,不是吗?
我的用例实际上非常简单:我需要从内部sage
(或Python
)远程绘制图表并在本地查看它们。我过去能够使用不同的计算机实现这一目标,但那是不久前的事了。我的解决方法是保存绘图并在本地打开它们(通过sshfs
),这有点愚蠢。
答案1
问题是您正在远程运行 Wayland 并且应用程序默认如此。
开始会话后,您可以执行以下操作:
$ export GDK_BACKEND=x11
正常的(deb 安装的)应用程序将被转发。因此您将能够使用eog
andevince
例如。
Firefox 很可能是您配置中的小菜一碟。快照的问题已经存在很长时间了。这是 snap bug 跟踪器中的一个这样的错误:“由于身份验证错误,X11 连接被拒绝。”通过 ssh 使用 snap 时。最后一条评论指出该错误已被分类并且有解决方法,但是解决方法不再工作(导出 XAUTHORITY 或将 .Xauthority 链接到快照可以看到它的位置)。
Firefox 的两种替代方案:
- 您可以使用 X11 启动 gdm 会话(注销,登录时,当您必须输入密码时,将会有一个齿轮提供会话类型)。
- 从 firefox.com 下载适合您平台的 firefox 二进制文件并运行它而不是 snap。由于它不再是一个快照,它应该像
evince
和 一样工作eog
。当有新版本时它还会提示您下载并自行更新。