背景

通常我们不希望在服务器上安装图形界面,但有时候有些程序需要图形界面,比如安装oracle的时候。此时,可以配置让Linux使用远程的X Server进行图形界面显示。

首先要明确的是Linux X Window System的基本原理,X是一个开放的协议规范,当前版本为11,俗称X11。X Window System由客户端和服务端组成,服务端X Server负责图形显示,而客户端库X Client根据系统设置的DISPLAY环境变量,将图形显示请求发送给相应的X Server。
 
因此,我们只需要在远端开启一个X Server,并在目标机器上相应的设置DISPLAY变量,即可完成图形的远程显示。
 
“真理体验”版

环境:远程无图形机器A(IP 192.168.9.135,OS CentOS 6.2),本地有图形机器B(IP 192.168.1.135,OS CentOS 6.2),子网192.168.0.0

X Server是Gnome等桌面环境的基础,一个桌面环境通常包含了XDM(X Display Manager,通常的图形化用户登录界面就属于XDM)、窗口管理器(X Server显示的图形是没有“窗口”边框的,通过替换窗口管理器可以实现不同的视觉效果,比如实现3D效果的Compiz)等组件。
 
进行图形显示并不需要桌面环境,只要有X Server即可。
 
现在要在B机器上开启一个X Server,然后配置A机器的DISPLAY环境变量指向B上面的X Server,在A上启动一个图形程序,图形应该在B上面进行显示。
 
Linux提供了一个startx脚本来启动X Server,startx脚本通过调用xinit来完成此工作。xinit完成两个工作,首先在后台启动一个X Server,然后根据配置启动一系列客户端程序连接到X Server,这些客户端程序只有最后一个可以并且必须在前台运行,当这个前台的客户端程序退出时X Server将被关闭。
 
B机器上有桌面环境,查看进程可以看到如下进程在运行:
/usr/bin/Xorg :0 -nr -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-Ikd3i7/database -nolisten tcp vt1
这表示在display 0上运行着一个X Server,这里的X Server是Xorg。出于安全考虑,这个X Server不监听TCP连接(-nolisten tcp),所以无法通过网络连接上这个X Server。X Server可以通过TCP和域套接字进行连接,后面讲述DISPLAY变量时会详细描述。
 
我们可以通过startx或直接使用xinit来手动启动一个X Server,startx的选项与xinit相同,选项直接传递给xinit。xinit选项分为两个部分,以符号 “--”为界,前面是客户端选项,后面是X Server选项。
startx [ [ client ] options ... ] [ -- [ server ] [ display ] options ... ]
要注意的是“client”(即要运行的客户端程序)必须以绝对路径的形式出现。如果不指定“client”,startx或xinit会根据用户和系统全局的配置文件启动一个客户端程序(一般xinit默认启动xterm程序)。
 
现在我们启动一个X Server:
xinit /usr/bin/xterm -- : &
这个命令可以在桌面环境下的终端里面运行,也可以在字符终端下运行。机器B上的桌面环境显示在终端Ctrl-Alt-F1上,F2-F6都是字符终端,F7-F12留给图形终端。在B机器的F2字符终端上执行以上命令,将在F7终端出现xterm。
 
接下来要配置A机器的DISPLAY变量,以便将图形显示到B机器上。以另一终端登录A机器,设置DISPLAY变量:
export DISPLAY=192.168.1.135:1.0
DISPLAY变量的格式为[Address]:{NumA}.{NumB}。其中Address为X Server地址,如果Address为空,则通过域套接字连接到本地的X Server。NumA为display number,这与传递给xinit的display选项对应,这个display number为X Server的监听端口号送去6000。因此,实际上此时B机器上的X Server在监听6001端口,可以使用netstat命令验证。NumB为screen number(可能是多显示器的情况下指定显示在哪个显示器,未验证),通常情况下都为0.
 
现在关闭B机器的防火墙(或者打开相应端口),以便A机器的X客户端程序可以连接上B机器上的X Server。然后在A机器上刚才设置DISPLAY变量的那个会话中,启动一个带有图形界面的程序,图形将会显示在B机器的F7终端上。
 
如果提示无法连接到DISPLAY指定的X Server,可能是由于X Server打开了访问控制。在A机器上已设置DISPLAY变量的会话中使用xhost命令查看授权信息:
xhost
如果显示无法打开display,则可以确定是因为X Server开启了访问控制。
 
在B机器F7终端由xinit打开的xterm中使用xhost授权A机器访问:
xhost + 192.168.9.135
然后在B机器F7终端xterm上使用xhost命令查看ACL,可以看到192.168.9.135已获得授权。此时,在A机器已设置DISPLAY的会话中运行xhost,同样可以看到ACL,再运行图形程序,图形应显示在B机器F7终端上。
 
SSH隧道转发版

SSH提供了X11转发的功能,可以使用SSH简单地实现上一节描述的功能。

首先确认A机器上的SSH Server打开的X11转发功能。检查SSH Server配置文件/etc/ssh/sshd_config,确认有如下配置:
X11Forwarding yes
然后在从B机器上SSH到A机器:
ssh -X 192.168.9.135
-X选项打开SSH的X11转发功能。
 
在此会话中查看A机器上的DISPLAY变量,应与下面类似:
localhost:10.0
在此会话中查看A机器上的TCP监听端口,应有6010端口。
 
在此会话中启动A机器上的图形程序,图形应显示在B机器上。
 
实际上,SSH在A机器上打开了一个监听端口6010,并且在登录会话开始时为会话设置了DISPLAY变量为localhost:10.0。随后此会话中的图形程序运行时,X11 client库会将X请求发送到SSH监听6010端口中,然后A机器上的SSH将X请求转发到B机器,B机器的SSH客户端收到X请求后交给B机器上的X Server显示。
 
SSH隧道转发Windows版
 
原理与上一节类似,X请求由SSH转发,只不过图形在Windows上显示。
 
首先在Windows上安装并运行一个X Server,这里选用Xming。然后使用ssh客户端连接上机器A,这里选用SecureCRT作为ssh客户端(使用putty同样可以)。
 
SecureCRT的会话选项作如下 设置:
 实际上这里对SecureCRT的设置与上一节中ssh -X选项相同。
 
如果已经登录机器A,注销再重新登录。查看DISPLAY变量:
 
启动一个图形程序,界面将在Windows上显示:
 
 
小结
通过上述的几个小实验,应该对X11的基本原理有了比较清晰的理解,以后遇到某些软件必须使用图形界面的时候,可以在Windows上使用Xming来进行远程图形显示,不必为此在服务器上安装臃肿的图形环境了。
 

Linux使用远程X Server显示图形的更多相关文章

  1. linux下的X server:linux图形界面原理

    linux下的X server:linux图形界面原理   Moblin Core是在Gnome Mobile的平台上建立.我以前玩Linux,提交的都和图像没有关系,连Xwindows都不用启动,开 ...

  2. [转帖]linux下的X server:linux图形界面原理

    linux下的X server:linux图形界面原理 https://www.cnblogs.com/liangxiaofeng/p/5034912.html linux下的X server:lin ...

  3. vncserver和Ubuntu Xfce4远程桌面环境的配置,解决不显示图形界面

    vncserver和Ubuntu Xfce4远程桌面环境的配置 参考的http://blog.163.com/thinki_cao/blog/static/8394487520130301453180 ...

  4. [转帖]Ubuntu 18.04 server安装图形界面及realvnc远程桌面连接

    Ubuntu 18.04 server安装图形界面及realvnc远程桌面连接 https://blog.csdn.net/networken/article/details/88938304 转帖 ...

  5. Linux 上的 SQL Server 2017 的安装指南

    一:介绍背景 微软在2016年 3 月首次对外宣布了 Linux 版的 SQL Server,并于2017年 7 月发布了首个公开 RC 版.前几日在美国奥兰多召开的微软 Ignite 2017 大会 ...

  6. Linux/Windows远程桌面

    WINDOWS远程连接LINUX配置(LINUX VNC Server配置):   1.查看本机是否有安装vnc(centOS5默认有安装vnc) rpm -q vnc vnc-server 如果显示 ...

  7. Linux SSH远程文件/目录 传输

    Linux SSH远程文件/目录传输命令scp 2010年08月6日 上午 | 作者:VPS侦探 相信各位VPSer在使用VPS时会经常在不同VPS间互相备份数据或者转移数据,大部分情况下VPS上都已 ...

  8. Windows与Linux相互远程桌面连接

        对于远程桌面连接Linux,大家可能会第一时间想到使用VNC,,远程桌面Windows,大家第一时间会想到使用Windows自带的远程桌面.那么有没有办法,使得在Linux中可以远程Windo ...

  9. Centos下ftp协议连接远程ftp server主机

    环境说明 [root@Check3 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@Check3 ~]# uname -a L ...

随机推荐

  1. [分享] 自动化测试与持续集成方案-- UI 检查

    对于自动化测试中,UI 自动化测试估计是最有争议的,让人又爱又恨. UI 自动化做回归测试,可以省下很多人力.如果版本一直不稳定,投入跟产出不成比例的. 时机 一般是要版本稳定,界面改动不大.如果迭代 ...

  2. (转)在Linux里设置用户环境变量的方法

    背景:在linux下,root用户安装完jdk后,非root用户不能使用java环境变量. 问题排查: 通过在root和非root用户下分别执行echo $PATH 可以观察环境变量的异同.然后将需要 ...

  3. pwnable.kr random 之 write up

    ---恢复内容开始--- 首先看源代码: #include <stdio.h> int main(){ unsigned int random; random = rand(); // r ...

  4. ECMAscript6新特性之解构赋值

    在以前,我们要对变量赋值,只能直接指定值.比如:var a = 1;var b = 2;但是发现这种写法写起来有点麻烦,一点都不简洁,而在ECMAScript6中引入了一种新的概念,那就是" ...

  5. 全站 HTTPS 没你想象的那么简单

    对自己无知这件事本身的无知真的挺可怕 认知偏差现象一直存在于我们每个人身上,谁也避免不掉,不过是有的人了解这件事儿,有的人不怎么知道而已,这就产生了「无知而不自知」的认知偏差.当然,这时候你自己忽悠自 ...

  6. spring mvc4使用及json 日期转换解决方案

    spring mvc使用注解方式配制,以及对rest风格的支持,真是完美致极.下面将这两天研究到的问题做个总结,供参考.1.request对象的获取方式1:在controller方法上加入reques ...

  7. 从零开始编写动态库文件Makefile,C++版

    这篇文章前,假设你已经看过<跟我一起写Makefile(一)>,陈皓写的那个. 对现有的一个C++动态库文件和调用程序,分别编写Makefile文件,从零开始,花了四天时间才搞清楚一半,生 ...

  8. 移动端https抓包那些事--进阶篇

    上一次和大家介绍了手机端https抓包的初级篇,即在手机未root或者未越狱的情况下如何抓取https流量,但是当时分析应用时会发现,好多应用的https的流量还是无法抓取到,这是为什么呢? 主要原因 ...

  9. python 脚本在linux环境下运行

    有两种方式:1.直接使用python xxxx.py执行.其中python可以写成python的绝对路径.使用which python进行查询.2.在文件的头部(第一行)写上#!/usr/bin/py ...

  10. 【机器学习笔记之一】深入浅出学习K-Means算法

    摘要:在数据挖掘中,K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 在数据挖掘中,K-Means算法是一种c ...