Linux DISPLAY环境变量的妙用(error:QXcbConnection: Could not connect to display) ,xhost 命令, 通过ssh连接显示界面

本文主要是介绍Linux DISPLAY环境变量的妙用(error:QXcbConnection: Could not connect to display) ,xhost 命令, 通过ssh连接显示界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#PS:要转载请注明出处,本人版权所有

#PS:这个只是 《 我自己 》理解,如果和你的

#原则相冲突,请谅解,勿喷

最近由于特殊原因,要在字符终端中的bash运行一个带GUI的PyQT程序。
报了一个错误为:QXcbConnection: Could not connect to display

我在GUI桌面中的bash能够执行此PyQt程序,但是在字符终端中的bash执行就会报错

想到是由于无图形界面的原因,在网上找了一下午,想实现一个功能就是在tty1中指定tty7来运行这个程序,但是没有找到解决办法,最后发现一个环境变量可以很Ok的解决此问题。

###此类问题可以归结于:在非图形终端执行了一个GUI程序,导致X11Server在此终端的环境下无法显示图形,需要手动指定X11Server把图形显示到其他的带图形界面的终端。

DISPLAY 变量
eg:DISPLAY=hostip:NumA.NumB
(注意当显示到本机的其他tty时,hostip 为空,一般情况下NumA,NumB为0)
eg:DISPLAY=:0.0

2019/03/25更新

有意栽花花不发,无心插柳柳成荫。

原文的本意只是简单记录了我的一个试验成功的实验,没想到那么多人关注这个。
原试验内容:你按ctrl+atl+F1进入tty1,然后你在tty1中执行带GUI功能的程序,一般就会报相应的显示错误。这个错误的原因就是DISPLAY变量没有设置的原因。你可以通过:echo ${DISPLAY}

简单来说,当你在终端执行一个带GUI功能的程序的时候,如果DISPLAY变量没有定义,就会报相应的错误。至少对于Xserver的系统是这样的。

DISPLAY 简单说明

我就是简单翻译此网页的某些我们关注的段落(如有侵权,联系我立即删除):https://gerardnico.com/ssh/x11/display

The magic word in the X window system is DISPLAY.
在X视窗系统中,这个比较神奇的SHELL变量是DISPLAY。The X display server install itself normally as display number 0 on your local machine. 
在你的本地机器上,X显示服务程序在安装的时候,会把自己设置为“显示0”。A display consists (simplified) of:
a keyboard,
a mouse
and a screen.
一个“显示”一般由以下内容组成:
一个键盘
一个鼠标
一个显示器。A display is managed by a server program, known as an X server. The server serves displaying capabilities to other programs that connect to it.
一个“显示”被一个叫做X服务的服务程序管理。这个服务为连接它的其他程序提供“显示“服务。The SSH protocol has the ability to securely forward X Window System applications over an encrypted SSH connection, so that you can run an application on the SSH server machine and have it put its windows up on your local machine without sending any X network traffic in the clear. $DISPLAY on the remote machine should point to localhost. SSH does the forwarding.
SSH协议通过一个加密的SSH连接,能够安全地传输X桌面系统程,因此,在没有发送任何X网络传输的时候,你可以毫无阻碍地在SSH所在的服务器运行你的程序并让其界面在你本地电脑启动起来。DISPLAY变量必须在远程机器上设置为localhost,SSH配置为启用X11转发。The value of the display environment variable is:
这个DISPLAY环境变量的值是:hostname:D.S
主机名:"显示号".“屏幕号”where:
说明:hostname is the name of the computer where the X server runs. An omitted hostname means the localhost.
一个运行了X服务的计算机的名字是主机名。一个缺省的主机名是localhost。D is a sequence number (usually 0). It can be varied if there are multiple displays connected to one computer.
D 是一个通常为0的序列号。它可以区分这个有多少个“显示”连接到了这个计算机。S is the screen number. A display can actually have multiple screens. Usually there's only one screen though where 0 is the default.
S 是一个屏幕号。一个“显示“能够有多个屏幕。通常,一个计算机有一个屏幕,其序号默认是0。hostname:D.S means screen S on display D of host hostname; the X server for this display is listening at TCP port 6000+D.
hostname:D.S这种格式的定义是:“显示D”显示到一个主机为hostname的屏幕上。X服务对于这个“显示”是通过监听TCP端口6000+D 这个端口号实现的。(如:localhost:4.0,  对于这个显示实例,Xserver监听的就是6004这个端口.)host/unix:D.S means screen S on display D of host host; the X server for this display is listening at UNIX domain socket /tmp/.X11-unix/XD (so it's only reachable from host).
host/unix:D.S这种格式的定义是:“显示D”显示到一个主机地址为host的屏幕上。X服务对于这个“显示”是通过监听UNIX本地socket实现的。因此host必须是可以连接的。:D.S is equivalent to host/unix:D.S, where host is the local hostname.
:D.S 和host/unix:D.S是一样的。这里是一种简写方式,host是本地的主机名,如localhost.

以上翻译可能不太准确,我翻译很屁的。

2019/09/26更新 ,补充xhost命令

今天再ubuntu 18.04上,切换root,运行/snap/bin/gnome-system-monitor程序,显示如下:
在这里插入图片描述
我首先说明,这里我已经设置了DISPLAY环境变量,但是发现我被拒绝连接了。于是查了查,和xhost命令有关,xhost简单来说就是控制其他用户或者其他ip是否可以访问当前用户启动的xserver。
于是我解除其他用户访问限制:
xhost +
在这里插入图片描述
然后再次root重新运行,可以正常打开了。
在这里插入图片描述

2020/03/13更新 用xshell,putty等ssh链接工具链接时,显示图形界面

在这里插入图片描述
在这里插入图片描述
勾选后,你再次进入shell(重连ssh),echo $DISPLAY 会发现变量已经被定义了。下面用xshell为例。

在这里插入图片描述

如果没有DISPLAY变量还是空,则配置sshd_config文件。如下图打开x11转发:
/etc/ssh/sshd_config文件 如果画框为no改为yes
在这里插入图片描述
sudo service ssh restart 重启sshd服务
再次通过xshell连接linux目标。就可得到如下的图:(如未得到,多检查,多学习)
在这里插入图片描述
图中画框的tcp就是转发出来的x11链接,你如果再开一个ssh链接,你会发现DISPLAY变量又变了:
在这里插入图片描述
这个时候你在xshell终端中输入任何一个gui 程序,会弹出如下框,安装好后,就可以正常显示GUI界面了。

在这里插入图片描述
xmanager是收钱的,我这里用另外一个MobaXterm但是道理都是一样的。
在这里插入图片描述
其实这里的更新内容,在我翻译的那段文字里面有,只是不知道多少人看了!!!!哎!!!

总结

一句话来说,对于桌面是由x服务的图形系统来说,只有设置了DISPLAY变量,才能够让GUI程序正常的显示起来。
对于我们经常进入的桌面,然后开一个terminal,你会发现,DISPLAY已经被自动设置了。所以才没有问题。而对于我们进的不是桌面terminal来说,DISPLAY变量是没有设置的。需要我们手动设置,GUI程序才能够正常启动。

2019/09/26更新,如果无法正常显示, xserver安全访问系统可能会阻止你访问xserver,当设置了正确的DISPLAY变量后无法显示,请尝试xhost 命令解除访问控制。

#PS:请尊重原创,不喜勿喷

#PS:要转载请注明出处,本人版权所有.

有问题请留言,看到后我会第一时间回复

这篇关于Linux DISPLAY环境变量的妙用(error:QXcbConnection: Could not connect to display) ,xhost 命令, 通过ssh连接显示界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065773

相关文章

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作