Linux使用远程X Server显示图形

2023-05-16

背景

通常我们不希望在服务器上安装图形界面,但有时候有些程序需要图形界面,比如安装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 -- :1 &  
这个命令可以在桌面环境下的终端里面运行,也可以在字符终端下运行。机器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来进行远程图形显示,不必为此在服务器上安装臃肿的图形环境了。
 

转载于:https://www.cnblogs.com/hellogc/p/3219902.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何从脚本编辑 /etc/sudoers?

    我需要编辑 etc sudoers从脚本中添加 删除白名单中的内容 假设我有一个可以处理普通文件的命令 我如何将其应用到 etc sudoers 我可以复制并修改它 然后有visudo用修改后的副本替换原始版本 通过提供我自己的脚本 EDI
  • 如何在Linux上用C/C++编写Web服务器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑在 Linux 平台上开发一个小型 阅读 初级 Web 服务器 但我不知道从哪里开始 我希望它能够做的是 监听特定端口 接受
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

    无输出 https stackoverflow com questions 54507957 printf call from assembly do not print to stdout即使在终端上 当输出不包含换行符时也有相同的原因
  • 如何在线程创建和退出时调用函数?

    include
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt

随机推荐

  • CNN对位移、尺度和旋转不变性的讨论

    CNN得益于全局共享权值和pool操作 xff0c 具有平移不变性 对于尺度不变性 xff0c 是没有或者说具有一定的不变性 xff08 尺度变化不大 xff09 xff0c 实验中小目标的检测是难点 xff0c 需要采用FPN或者其他的方
  • AtCoder Regular Contest 069 D 思维,模拟 E 模拟,贪心

    AtCoder Regular Contest 069 D Menagerie 题意 xff1a n只动物从1到n围成一个圈 xff0c 每只动物要么是羊要么是狼 每只动物会说出一个字母 xff0c 说 39 o 39 表示它两边动物种类相
  • git stash解决代码merge出错

    最近在使用git提交代码时 xff0c 遇到一个问题 xff0c 就是我修改了几个文件的代码 xff0c 然后又想把自己代码库里面的代码更新到最新版本 xff0c 然后不出所料 xff0c 代码冲突了 xff01 作为一个喜欢解决问题的程序
  • 锐捷网络交换机的配置命令集

    转自 xff1a http hi baidu com bjgbd 交换机 gt Enable 进入特权模式 Exit 返回上一级操作模式 End 返回到特权模式 write memory 或copy running config start
  • MongoDB——配置文件详解

    配置文件 MongoDB常用配置参数可以由config配置文件统一设置实现 Mongod的配置文件是mongod yaml Mongos的配置文件为mongos yaml MongoDB在2 6版本开始 xff0c 配置文件 采用YAML格
  • 计算机远程桌面自动关闭,windows10重启之后自动关闭远程桌面是怎么回事

    首先 xff0c 请大家打开Win 10系统桌面主页面 xff0c 在桌面页面中点击开始菜单 xff0c 在弹出的开始菜单中点击选择 设置 选项 xff0c 进入Win10系统设置页面 在Win10系统设置页面中 xff0c 点击选择 更新
  • openwrt issues

    1 ssh 没密码不让登录 解决方法 xff1a 使用串口登录上 passwd root 设置密码后 etc init d dropbear restart 发现option BannerFile 39 etc banner 39 被屏蔽掉
  • 图片样本集

    图像识别训练样本集 ImageNet ImageNet是一个计算机视觉系统识别项目 xff0c 是目前世界上图像识别最大的数据库 是美国斯坦福的计算机科学家李飞飞模拟人类的识别系统建立的 能够从图片识别物体 目前已经包含14197122张图
  • ubuntu16.10安装网易云音乐

    首先去官网 xff08 https music 163 com download xff09 下载安装包 xff1a netease cloud music 1 1 0 amd64 ubuntu deb 下载好以后 xff0c 执行安装命令
  • 安装 protoc 的各种坑

    首先下载 protoc 2 6 1 https github com google protobuf releases download v2 6 1 protobuf 2 6 1 tar gz https pkgs org downloa
  • 在mysql中创建视图需要使用什么语句_mysql如何创建视图?创建语句是什么?

    在mysql中 xff0c 可以使用 CREATE VIEW 语句来创建视图 xff0c 语法格式为 CREATE VIEW AS xff1b 其中 不能包含FROM子句中的子查询 xff0c 不能引用预处理语句参数 推荐教程 xff1a
  • 正则表达式学习

    1 正则表达式规则 1 1 普通字符 字母 数字 汉字 下划线 以及后边章节中没有特殊定义的标点符号 xff0c 都是 34 普通字符 34 表达式中的普通字符 xff0c 在匹配一个 字符串的时候 xff0c 匹配与之相同的一个字符 举例
  • 在Windows、Mac和 Linux系统中安装Python与 PyCharm

    工欲善其事 必先利其器 xff0c 本文介绍 Python环境的安装和 Python的集成开发环境 IDE PyCharn的安装 一 Python安装 Windows Mac和 Linux 当前主流的 Python版本为2x和3x 由于 P
  • Linux入门-安装篇(Debian 服务器版)

    本文描述了安装一个Linux xff08 Debian xff09 服务器的全过程 xff0c 并附加了一些必要的参考文章 xff0c 通篇以Debian为基础 xff0c 以建立一个服务器 xff08 非桌面环境 xff09 为主要目的
  • MongoDB——写出错机制

    写出错机制 MongoDB的写操作命令默认是没有任何出错返回值的 xff0c 这减少了写操作的等待时间 xff0c 也就是说 xff0c 不管有没有写入到磁盘或者有没有遇到错误 xff0c 它都不会报错 这在大量插 入类似GPS定位坐标信息
  • git入门1

    2016 04 23 19 25 02 参考 xff1a http blog jobbole com 78960 Git bash中运行git log之后怎样终止这个命令 xff0c 按q 再按回车键 清屏 clear 查询用户名 git
  • mysql查看库表的大小_MySQL查看数据库大小和表大小的方法

    MySQL查看数据库大小和表大小的方法 其实很简单 xff0c 就不多说了 xff0c 基本上看得懂代码都明白 查看MySQL数据库大小 SELECT table schema Database Name sum data length 4
  • 按键控制led灯亮灭c语言实验报告,嵌入式STM32学习笔记之按键查询方式控制led灯的亮灭...

    其实接触STM32已经快半年了 xff0c 端断续续的也学习了一下的STM32的各个模块的基本功能 xff0c 刚开始的时候也是看比人的写的代码 xff0c 看懂了然后再去修改 xff0c 能够在自己的平台上实现基本的功能 xff0c 也就
  • iOS 开发比较实用的框架总结(上)

    iOS开发比较实用的框架总结 下拉刷新类型的框架 EGOTableViewPullRefresh https github com enormego EGOTableViewPullRefresh 最早的下拉刷新控件 SVPullToRef
  • Linux使用远程X Server显示图形

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