Java 无法使用‘ localhost: 10.0’作为 DISPLAY 变量的值连接到 X11窗口服务器

我有一个脚本,它使用 java 连接到 localhost 的端口10.0中显示 X11

但我总是得到这个错误

java.lang.InternalError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.
at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:62)
at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:178)
at java.security.AccessController.doPrivileged(Native Method)
at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:142)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:112)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at java.awt.Toolkit$2.run(Toolkit.java:849)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:841)
at ij.io.Opener.openJpegOrGif(Opener.java:367)
at ij.io.Opener.openImage(Opener.java:220)
at ij.io.Opener.openImage(Opener.java:249)
at ij.io.Opener.open(Opener.java:116)
at ij.IJ.open(IJ.java:1112)
at ij.macro.Functions.open(Functions.java:2006)
at ij.macro.Functions.doFunction(Functions.java:129)
at ij.macro.Interpreter.doStatement(Interpreter.java:205)
at ij.macro.Interpreter.doBlock(Interpreter.java:515)
at ij.macro.Interpreter.runUserFunction(Interpreter.java:278)
at ij.macro.Interpreter.getFactor(Interpreter.java:1200)
at ij.macro.Interpreter.getTerm(Interpreter.java:1162)
at ij.macro.Interpreter.getExpression(Interpreter.java:1145)
at ij.macro.Interpreter.getBooleanExpression(Interpreter.java:881)
at ij.macro.Interpreter.getLogicalExpression(Interpreter.java:857)
at ij.macro.Interpreter.getBoolean(Interpreter.java:850)
at ij.macro.Interpreter.doIf(Interpreter.java:829)
at ij.macro.Interpreter.doStatement(Interpreter.java:217)
at ij.macro.Interpreter.doBlock(Interpreter.java:515)
at ij.macro.Interpreter.doStatement(Interpreter.java:241)
at ij.macro.Interpreter.doIf(Interpreter.java:831)
at ij.macro.Interpreter.doStatement(Interpreter.java:217)
at ij.macro.Interpreter.doStatements(Interpreter.java:195)
at ij.macro.Interpreter.run(Interpreter.java:99)
at ij.macro.Interpreter.run(Interpreter.java:65)
at ij.macro.Interpreter.run(Interpreter.java:75)
at ij.plugin.Macro_Runner.runMacro(Macro_Runner.java:127)
at ij.plugin.Macro_Runner.runMacroFile(Macro_Runner.java:112)
at ij.IJ.runMacroFile(IJ.java:103)
at ij.ImageJ.main(ImageJ.java:517)

为了解决这个问题,我什么方法都试过了,比如:

export DISPLAY=:10.0
export DISPLAY=localhost:10.0

我也尝试了端口0.0,但总是得到相同的错误

在试过 Xhost 之后

xhost +local:all
xhost:  unable to open display ""
xhost:  unable to open display ":10.0"

我该怎么补救 我认为 X 服务器不运行,所以我尝试 startx它说它在该端口运行

我的系统是 Ubuntu 服务器版本10.04

395492 次浏览

您需要在启动时指定 -Djava.awt.headless=true参数。

这将解决问题:

/usr/bin/java -Djava.awt.headless=true $Your_program

删除 DISPLAY 变量

unset DISPLAY

这在大多数情况下有帮助(例如启动应用服务器或其他基于 Java 的工具) ,并避免修改所有那么多的命令行。

对于专门的 app-server/tools 用户来说,将其添加到. bash _ profile 中也很方便。

这个命令帮助我解决了这个问题:

export DISPLAY=:0

我使用它的唯一方法就是使用一个模板来运行脚本,比如 sudo./ glassfish-3.1.2.2-unix.sh -s 模板

这将以静音模式安装 Glassfish

我在远程运行 jsole 命令时遇到了同样的错误。我想修改一个运行在远程 Linux 主机上的 jsole 参数,我可以使用 secureCRT 登录主机,终端抛出这个错误信息。幸运的是,当使用腻子,它是好的。真奇怪。

如果在 Hudson 中看到此错误,请尝试删除。从你的主目录的 java 目录,它可能为你工作。

以防有人试图通过 CI 上的 maven-surefire-plugin 运行自动化单元测试(Jenkins,。.)如果遇到上面提到的错误,一定要更新你的 sure fire 插件配置:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<systemPropertyVariables>
<java.awt.headless>true</java.awt.headless>
</systemPropertyVariables>
</configuration>
</plugin>

If you start application on a remote server while logged in by ssh then another way would be to start ssh with -x parameter or add ForwardX11 no in your /etc/ssh/ssh_config. In this case ssh will not create environment variable DISPLAY.

Michael-O 给出了解决这个问题的有效方法。另一种解决方法是使用 Putty Console 启动服务器。

经过几天徒劳的努力,安装玻璃鱼覆盆子 π2与无头软呢帽22,以下为我没有一个顺利的工作

 unset DISPLAY
java -Djava.awt.headless=true -jar glassfissh-installer-v2ur2-b04-linux.jar

我得到了 给你的帮助

第一: 启动 XQuartz

第二: ssh-X user@ip _ address

开始你的进程

如果您 ssh 然后启动 XQuartz,就会得到这个错误

对我来说,问题是 Xorg-x11-xauth没有安装,我安装了它,然后它就工作了。

我现在拥有的包裹是:

  • LibX11-common-1.6.3-2. el6.noarch
  • LibX11-1.6.3-2. el6.i686
  • LibX11-1.6.3-2. el6.x86 _ 64
  • Xorg-x11-drv-ati-firware-7.6.1-2. el6.noarch
  • Xorg-x11-xauth-1.0.9-1. el6.x86 _ 64

对于我来说,我的机器已经没有空间了,我也面临着同样的问题。 有时候可能是空间问题。检查 Linux/Unix 环境中的空间,确保您的机器有足够的空间。

我在使用 Xming 时遇到了类似的错误:

  1. 在 Xming 启动复选框中无访问控制。
  2. 在 putty 中运行以下命令: DISPLAY=XXX.XXX.XXX.XX:0.0; export DISPLAY

Replace XXX.XXX.XXX.XX with your IP address.

对于我登录作为 -Y而不是-X 工作。

如果您得到了如下所示的不可信的 X11,那么尝试使用 -Y 标志(如果您信任主机) :

警告 : 不受信任的 X11转发设置失败: xauth 密钥数据未生成

我认为您是在 sudo 模式下工作。请检出到用户模式,然后再试一次

If you're triggering your code from Jenkins, enabling the option "Start Xvfb before the build, and shut it down after" might help. It helped me.

更改为另一个用户,并尝试除根。它为我工作。

I just didn't log out of root before running ./studio.sh All set.

Ubuntu 17.10版本 安装 X 虚拟帧缓冲区(xvfb)

apt install xvfb

并将这些行添加到/etc/profile 文件中..。

# Start the X virtual frame buffer (Xvfb)
if [ -f /usr/X11R6/bin/Xvfb ]; then
/usr/X11R6/bin/Xvfb :1 -screen 0 1366x768x32
fi


# Set the DISPLAY variable for the X virtual frame buffer (Xvfb)
export DISPLAY=localhost:1.0

在我的例子中,这个错误与 DISPLAY 端口无关。我试图将一个 XML 加载到 Windchill (一个 PLM 软件)中,在终端上只收到了上面的错误。在一个日志文件中,我发现了 我的 XML 文件被破坏了的报告。也许有人有类似的问题,可以使用这个答案。

如果使用或设置为/etc/profile,首先在构建 Jenkins 阶段执行以下操作:

unset DISPLAY
export DISPLAY=:0

然后使用 java 代码或 maven 设置这个属性: - Djava.awt.headless = false

解决了,我只要注销然后用 xorg 登录就行了!

我的问题是防火墙,暂时关闭了。

服务器主机名指向另一个 IP 地址。将其设置为 localserver。strace xclock帮助调试了这个问题。

我已经通过使用 Xorg 登录解决了这个问题。默认情况下,我使用的是韦兰。看起来韦兰消除了 Xorg 的大部分设计缺陷,但它也有自己的问题。enter image description here

如果您试图使用 su 导出 display,但它仍然不能工作。 This is what worked for me. Try X11 forwarding for sudo users.

使用 -X 选项和 ssh 连接远程主机。

# ssh -X root@remote-host

现在列出当前用户的 cookie 集。

# xauth list $DISPLAY
node01.thegeekdiary.com/unix:10  MIT-MAGIC-COOKIE-1  dacbc5765ec54a1d7115a172147866aa
# echo $DSIPLAY
localhost:10.0

使用 sudo 切换到另一个用户帐户。

# sudo su - [user]
# xauth add node01.thegeekdiary.com/unix:10  MIT-MAGIC-COOKIE-1  dacbc5765ec54a1d7115a172147866aa

再次为 sudo 用户导出步骤2中的显示。尝试使用 xlock 命令验证 x 客户机应用程序是否正常工作。

# export DISPLAY=localhost:10.0

来源: https://www.thegeekdiary.com/how-to-set-x11-forwarding-export-remote-display-for-users-who-switch-accounts-using-sudo/

检查 $DISPLAY 变量是否设置,使用以下命令:

显示

如果未设置 display 变量,请运行以下命令进行设置(即使设置了,您的会话也可以使用以下命令)

出口显示 = : 0.0

在腻子也有 x 显示位置为: 0.0

这解决了我的问题

xhost +

but Be aware that xhost + completely deactivates authentication and allows everyone to access all application on your screen.

xhost +si:localuser:root似乎与适当的身份验证类似。

对我来说,以上这些方法都不管用,但是经过长时间的研究,这个方法对我管用。

export DISPLAY=localhost:20.0

在我正在研究的 Linux 服务器上也有同样的问题。将 java 连接到 X11显示器可以在头节点上工作,但不能在其他任何节点上工作。在与管理员联系之后,我们发现当前版本的作业调度系统(SLURM)不支持 X11转发。他们必须更新 SLURM (新版本的 SLURM 支持它)才能工作。

  1. export localhost:1

  2. - Djava.awt.headless = true