X11 转发适用于某些程序,其他程序忽略 $DISPLAY?

X11 转发适用于某些程序,其他程序忽略 $DISPLAY?

我有 2 台 Linux 机器正在运行。如果我通过一个连接到另一个

ssh -X 192.168.1.6

我能够启动xterm或 ,firefox并且窗口按预期在我正在使用的机器上显示。

但是如果我启动gnome-terminalmeld,这些程序的窗口将显示在远程计算机上。

似乎没有一般的身份验证问题,因为我没有收到错误消息。我已经找到了那个线程:如何在无头服务器上远程启动 gnome-terminal? (无法通过X11转发启动)

从那里开始脚本:

#! /bin/bash
ID=foo.bar$RANDOM
GDK_BACKEND=x11 /usr/libexec/gnome-terminal-server --app-id "$ID" &
sleep .4        # yuck
gnome-terminal --app-id "$ID"
wait

效劳于gnome-terminal。但为了也是meld别无选择--app-id

我有办法让窗口显示在正确的机器上吗?

顺便说一句:两台机器上的 linux 版本都是 5.15.12-200.fc35.x86_64 fedora

如何在没有任何额外脚本和环境黑客的情况下让它工作:

只需在各处禁用 Wayland 即可!在 Fedora GDM 登录屏幕上,登录屏幕上提供了一个几乎隐藏的菜单您已选择要登录的用户。有一个小齿轮,在当前的 gnome 版本中它位于右侧,选择“X11 下的 gnome”可以解决 Wayland 问题。触摸屏工作后,字体渲染得到很大改善,鼠标指针校准工作完美。他们都没有与 Wayland 合作......只是作为旁注!注意:您必须始终在主机和远程端禁用 Wayland!

答案1

据我了解,引导程序使用X11转发的重要部分是变量GDK_BACKEND=x11。如果没有它,GNOME 应用程序将默认使用 Wayland 窗口系统,这将导致窗口显示在远程计算机上。

--app-id只是为了阻止gnome-terminal尝试连接到gnome-terminal-server可能在远程主机上的同一用户帐户上运行的任何其他现有实例(与该主机上的本地会话关联),或者可能由会话按需启动D-Bus,不知道使用 X11 转发的要求。相反,gnome-terminal只会与gnome-terminal-server被告知使用 X11 转发和GDK_BACKEND=x11环境变量的特定实例进行对话。

gnome-terminal只需要这个--app-id东西,因为gnome-terminal它并不是真正的终端应用程序:它只是一个小型客户端应用程序,它进行 D-Bus 调用,gnome-terminal-server创建实际的终端窗口。这是gnome-terminal无法区分的解决方法gnome-terminal-server:“嘿,在创建这个新的终端窗口时,请使用 X11 后端$DISPLAY,而$XAUTHORITY不是您可能已经拥有的任何默认显示排列。”

如果我的理论是正确的,那么你应该能够meld从一个简单的开始:

GDK_BACKEND=x11 meld

如果这有效,那么您可以创建一个简单的包装脚本,如下所示:

#!/bin/sh
if [ "$SSH_CONNECTION" != "" ] && [ "$DISPLAY" != "" ]; then
    GDK_BACKEND=x11 /usr/bin/meld "$@"
else
    exec /usr/bin/meld "$@"
fi

假设真实的meld位于/usr/bin/meld,您可以命名此脚本meld并将其放置到$PATH/usr/bin 之前的某个目录中,然后meld无论您是在本地运行还是通过 SSH X11 转发运行,都将始终执行正确的操作。

~/.bash_profile或者,您甚至可以~/.profile在远程计算机上添加一个简单的测试,GDK_BACKEND=x11以便在您的会话与具有 X11 转发的 SSH 连接关联时为所有程序设置:

if [ "$SSH_CONNECTION" != "" ] && [ "$DISPLAY" != "" ]; then
    export GDK_BACKEND=x11
fi

答案2

可以做相反的事情:在两端安装 waypipe (这使得 wayland 应用程序以 ssh -X 或 ssh -Y 为 X11 所做的方式转发)。您运行“waypipe ssh -X (blah)”而不是“ssh -X (blah)”,并且 waypipe 修改了 ssh 命令行以转发端口、运行远程 waypipe 并设置环境变量,以便 wayland 应用程序使用它。

那么不必禁用 wayland,您的 X11 应用程序将通过 X 转发进行转发,而 wayland 应用程序将通过 waypipe 进行转发。

(注意,我目前仍在使用 X11,所以我还没有尝试过这个;但据报道 waypipe 工作得很好。)

相关内容