指定的 X 服务器连接无效

Invalid X server connection specified

我运行想法在Ubuntu:sudo ./idea.sh
我使用库 LWJGL 编写了一个应用程序。而我在运行项目的时候,发现一个错误window:

Exception in thread "main" java.lang.IllegalStateException: Invalid X server connection specified.
at org.lwjgl.system.linux.opengl.LinuxGLContext.createFromCurrent(LinuxGLContext.java:68)
at org.lwjgl.system.linux.opengl.LinuxGLContext.createFromCurrent(LinuxGLContext.java:63)
at org.lwjgl.opengl.GLContext.createFromCurrent(GLContext.java:41)
at core.Core.createWindow(Core.java:160)
at core.Core.main(Core.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Core.java, 创意 windows:

if (glfwInit() != GL_TRUE) System.out.println("#0: Failed to create window");
    window = glfwCreateWindow(Settings.getWidth(), Settings.getHeight(), "Look", GL_NONE, GL_NONE);
    if (window == GL_NONE) System.out.println("#1: Failed to create window");
    glfwMakeContextCurrent(window);
    glfwShowWindow(window);

    ByteBuffer vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
    glfwSetWindowPos(window,
            (GLFWvidmode.width(vidmode) - Settings.getWidth()) / 2,
            (GLFWvidmode.height(vidmode) - Settings.getHeight()) / 2);
    GLContext.createFromCurrent(); // String №160
    glfwSwapInterval(1);

首先要做的事情是:您为什么要 运行 具有超级用户权限的图形应用程序?这通常是一个坏主意。


X11 实现了多种身份验证机制,以防止不属于登录会话的用户访问 X 服务器。这不是通过 Unix 文件权限实现的,而是通过协议身份验证实现的。因此,即使您是 root 用户,您也无法在不跳过几个环节的情况下与 X 服务器通信。特别是每个客户端都需要访问 Xauthority cookie。这些默认存储在 ${HOME}/.Xauthority 中,但可以定义为使用 XAUTHORITY 环境变量从不同位置获取。

因此,要通过 sudo 传递它,您需要将 XAUTHORITY 设置为指向您的登录会话用户的 ~/.Xauthority,然后使用环境保护选项调用 sudo。

export XAUTHORITY="${HOME}/.Xauthority"
sudo -E ./idea.sh

或者你可以在sudo之后设置XAUTHORITY环境。另一个更直截了当的选择是简单地在身份验证中打一个洞,允许所有客户端 运行 在本地访问 X 服务器。然而,这是一个坏主意,因为这样一来,您系统上的 每个 用户都可能 运行 键盘记录器或以其他方式扰乱您的会话(例如阻止屏幕储物柜工作)。你可以用 xhost +si:localuser 打那个洞,但你真的不应该这样做。