如果我有一个安装了 LXDE 和 TightVNCserver 的 Ubuntu 12.04 系统,并在端口上运行会话:1
(未通过 SSH 隧道传输)并建立活动的 SSH 连接,那么如何使用 SSH 启动需要活动显示的程序以使用可用的 tightVNC 会话?
我想使用 SSH 启动一个 java 文件,该文件在 vnc 会话内部启动时通常会正常启动,但我收到一个错误:
xxx@yyy:~# java zzz
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
at sun.awt.HeadlessToolkit.getScreenSize(HeadlessToolkit.java:282)
at zzz.<clinit>(zzz.java:35)
换句话说:我想启动一个程序并让它使用打开的 VNC 会话窗口,而不使用 VNC 客户端查看器会话来启动它,可以这样做吗?
(我认为任何需要显示的程序都会做出这样的反应,所以我认为这不是一个 java 问题,而是一个 ssh/vnc 问题)
答案1
尝试将DISPLAY
变量设置为 VNC 会话的 X 服务器:
DISPLAY=:1 java xxx
答案2
您将需要启用 X11 转发,这会将其转发到您自己的 X11 服务器(因此您需要在进行 SSH 的客户端上运行 X11 服务器)。
-X
这可以通过添加到 SSH 命令来完成。例如:ssh -X user@server
然后确保 $DISPLAY 变量设置为正确的显示。使用以下命令检查echo $DISPLAY
如果您想要通过 SSH 访问 X11 服务器上打开的窗口,我建议您看一下这个:http://www.wensley.org.uk/x
它解释了如何实现类似于“屏幕”的行为,但使用 X11 应用程序。
答案3
我想这里有几件事你可以做,其中一种方法是使用ssh -X
命令。
但是,我喜欢在您尝试连接的主机上运行 VNC 服务器(如 tightvnc)的方法。然后您可以ssh
访问该主机并使用 vnc 查看器进行显示(如果需要)。在您的ssh
终端上,连接到主机 vnc 并将其 5901 端口(假设您的 tightvnc 服务器正在监听 5901 端口)转发到本地 5901 端口。
ssh -L 5901:127.0.0.1:5901 -C [email protected]
并且,在另一个终端上连接到转发端口以查看 X11:
vncviewer localhost:5901
现在,当你运行命令时出现错误,这是因为你的 DISPLAY 变量未设置。你可以在终端export DISPLAY=:N
上输入来设置它ssh
。注意:否通常是 1,但为了验证,你可以在 x11-vnc 窗口中打开一个终端并输入echo $DISPLAY
,否是此处显示的任何值。