Linux DISPLAY环境变量的妙用(error:QXcbConnection: Could not connect to display) ,xhost 命令, 通过ssh连接显示界面
PS:要转载请注明出处,本人版权所有。
PS: 这个只是基于《我自己》的理解,
如果和你的原则及想法相冲突,请谅解,勿喷。
前置说明
本文作为本人csdn blog的主站的备份。(BlogID=033)
本文发布于 2017-03-27 18:03:28,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=033)
环境说明
无
前言
无
DISPLAY 变量
最近由于特殊原因,要在字符终端中的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: 要转载请注明出处,本人版权所有。
PS: 有问题请留言,看到后我会第一时间回复。
Linux DISPLAY环境变量的妙用(error:QXcbConnection: Could not connect to display) ,xhost 命令, 通过ssh连接显示界面的更多相关文章
- error: QXcbConnection: Could not connect to display
/********************************************************************************* * error: QXcbConn ...
- Linux环境中DISPLAY环境变量的解释及设置
在Linux/Unix类操作系统上的GUI应用程序使用X Window系统(X Window System),它旨在允许多个用户使用窗口化的应用程序通过网络访问计算机. DISPLAY环境变量用来设置 ...
- linux环境变量设置 以及 source命令 Linux 之 /etc/profile、~/.bash_profile 等几个文件的执行过程 Linux 设置环境变量
定制环境变量 环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell.对于Linux来说一般是bash,但也可以重新设定或切换到其它的Shell.环境变量文件:/etc/profil ...
- I.MX6 Linux U-boot 环境变量解析
/********************************************************************************** * I.MX6 Linux U- ...
- Linux中环境变量文件及配置
Linux中环境变量文件及配置 一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统 ...
- Linux SHELL,环境变量
SHELL: 在计算机科学中,Shell俗称壳(用来区别于核),是指"提供使用者使用界面"的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe.它接收用户命 ...
- Linux设置环境变量小结:设置永久变量&临时变量 全局变量&局部变量
1.总结背景 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁 ...
- Linux中环境变量文件及配置(转载)
一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登 ...
- Linux用户环境变量
Linux用户环境变量 环境变量就是系统或软件设置的一些参数,用户环境变量就是用户登录系统后,都有自已专用的运行环境.在Windows系统中用户环境变量保存在用户家目录,Linux也是同样的.本文主要 ...
- linux sudo环境变量设置
这是第一次在博客园中写自己的随笔,也是第一次使用Markdown的编辑环境,值得纪念一下!希望在以后学习linux的道路上能多多记录自己的学习心得和遇到问题的解决方法,朝着运维的方向迈出坚实的脚步. ...
随机推荐
- Linux中国开源社区停止运营
layout: post title: "Linux 中国开源社区停止运营" tags: - "Linux" 昨天看到老王发的公众号文章,Linux中国开源社区 ...
- KB0002.对DoraCloud的桌面模板系统盘进行扩容
KB0002.对DoraCloud的桌面模板系统盘进行扩容 DoraCloud的桌面是根据桌面模板创建的.桌面模板包含了系统盘.有时系统盘的空间不满足需求,就需要对系统盘大小进行调整. 我们以Hype ...
- 从零开始的react入门教程(五),了解react中的表单,何为受控组件与非受控组件
壹 ❀ 引 我们在从零开始的react入门教程(四),了解常用的条件渲染.列表渲染与独一无二的key一文中介绍了react中常用的条件渲染操作,比如三元运算符,逻辑运算符等,结合react组件或者re ...
- NVME(学习笔记一)—概述
NVMe概述 NVMe是一个针对基于PCIe的固态硬盘的高性能的.可扩展的主机控制器接口. NVMe的显著特征是提供多个队列来处理I/O命令.单个NVMe设备支持多达64K个I/O 队列,每个I/O队 ...
- Swoole从入门到入土(17)——WebSocket服务器[成员函数与配置选项]
这一节,我们重点了解websocket server的成员函数以及相关的配置选项. 1.成员函数 push:向 WebSocket 客户端连接推送数据,长度最大不得超过 2M. Swoole\WebS ...
- Java压缩和解压缩zip文件
介绍 Java提供的java.util.zip包只支持zip和gzip.至于更多格式的压缩可以选择apache的Commons Compress. 参考:https://o7planning.org/ ...
- 区间dp-Palindrome
Palindrome 题意:给一个字符串,问最少加上多少个字符,可以使这个字符串成为回文串 思路一.直接dp(会爆内存) dp[i][j]表示区间[i,j]之间有最少需要加上多少个字符 状态转移方程: ...
- win32 - EnumDisplayDevices和EnumDisplayMonitors的使用
EnumDisplayDevices枚举适配器 EnumDisplayMonitors枚举监视器 #pragma comment(lib, "dxva2.lib") #includ ...
- Nacos搭建单机实例
Nacos是阿里开源的微服务架构组件,既可以用作服务注册中心,也可用作配置中心. 虽然Nacos的官方文档也有关于如何部署的说明,但是个人觉得不够详细和连续,故本文将阐述在单机环境实际搭建Nacos环 ...
- 1-Django框架简介以及基本操作
安装 注意:安装的磁盘目录,以及后续通过Django创建目录的时候,不要出现中文,否则会出现预料之外的错误 建议:禁止套娃,即不要在A项目中创建B项目 # 如果不指定版本号,默认最新版 pip ins ...