SSH远程连接并调用qtcreator进行debug时出现的错误

在做完一个ShellScripts后,想通过远程连接在远端运行脚本(我是想利用Xshell通过ssh连接远端控制ubuntu16.04操作系统的Tx2),遇到了如下问题:

在做完一个ShellScripts后,想通过远程连接在远端运行脚本(我是想利用Xshell通过ssh连接远端控制ubuntu16.04操作系统的Tx2),遇到了如下问题:

一、Failed to connect to server socket :没有那个文件或目录 Unable to init server:无法连接:拒绝连接

图为作者在主机ubuntu16.04上远程ssh连接到远端机TX2上,执行图形界面程序报错

解决方法为在使用远程连接时加上参数 -X

即:

ssh -X localhost

至于原因是什么,不断翻阅资料后,在https://www.cnblogs.com/sddai/p/5648167.html网站上找到了相关的解释。

总得来说,就是我远程输入了一个打开图形界面程序的指令,而我所用的ubuntu16.04用的是Mir显示服务器(作为x窗口系统的一种替代),但我需要用x窗口系统才能打开图形界面!因此没有通过GUI session,无法启动该程序。

而为了启动服务器上的图形界面程序,我们需要启动X11转发功能

例如:通常情况下,使用Putty连接到SSH服务在终端界面就可以了。 但是,有时也需要启动服务器上的图形界面程序(如firefox)。这就需要用到X11转发功能

原理:

开启X11转发功能的方法:

方法1.如果你用的是Linux系统,例如我用的是ubuntu16.04,在终端使用ssh连接到远程机时加参数X即可。

ssh -X 用户名@IP地址

方法2.在Windows操作系统安装Xming,并启动Xming服务,使用Putty连接SSH服务器,并开启X11转发功能。

方法3.在Windows操作系统下安装Xmanager(它能将你的PC变成X window工作站,使你可以浏览远端X窗口系统)然后在Xshell中输入指令就行了。

为了方便大家理解,这里介绍下什么是“GUI”,“Mir”,“X11”

1.GUI

图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。

2.Mir(显示服务器)

Mir是由Canonical公司开发的Linux操作系统下的显示服务器。原本用以取代Ubuntu中的X窗口系统,但是2017年4月Canonical公司宣布放弃开发Mir专用的显示后端服务。(这可能代表ubuntu16.04系统使用的是Mir)

3.X窗口系统

X窗口系统(X Window System,也常称为X11X,天窗口系统)是一种以位图方式显示的软件窗口系统。最初是1984年麻省理工学院的研究,之后变成UNIX类UNIX、以及OpenVMS操作系统所一致适用的标准化软件工具包及显示架构的运作协议。X窗口系统通过软件工具及架构协议来创建操作系统所用的图形用户界面,此后则逐渐扩展适用到各形各色的其他操作系统上。现在几乎所有的操作系统都能支持与使用X。更重要的是,今日知名的桌面环境——GNOMEKDE也都是以X窗口系统为基础建构成的。

参考资料链接:https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/202.html

主要元件: X Server/X Client/Window Manager/Display Manager

X Window system采用的是C/S架构,这个架构分成 X Server 与 X Client 两个元件,其中 X Server 在管理硬件,而 X Client 则是应用程序。 在运行上,X Client 应用程序会将所想要呈现的画面告知 X Server ,最终由 X server 来将结果通过他所管理的硬件绘制出来。

我们在用户端想要取得来自服务器的图形数据时,我们用户端使用的当然是用户端的硬件设备啊, 所以,X Server 的重点就是在管理用户端的硬件,包括接受键盘/鼠标等设备的输入信息, 并且将图形绘制到屏幕上 (请注意上图的所有元件之间的箭头指示)。但是到底要绘制个啥东西呢? 绘图总是需要一些数据才能绘制吧?此时 X Client (就是 X 应用程序) 就很重要啦!他主要提供的就是告知 X Server 要绘制啥东西。那照这样的想法来思考,我们是想要取得远端服务器的绘图数据来我们的计算机上面显示嘛! 所以啰,远端服务器提供的是 X client 软件啊!

举个例子来说,当我们在 X Window 的画面中,将鼠标向右移动,那他是怎么告知 X Server 与 X Client 的呢? 首先, X server 会侦测到鼠标的移动,但是他不知道应该怎么绘图啊!此时,他将鼠标的这个动作告知 X Client, X Client 就会去运算,结果得到,嘿嘿!其实要将鼠标指标向右移动几个像素,然后将这个结果告知 X server , 接下来,您就会看到 X Server 将鼠标指标向右移动啰~

这样做有什么好处啊?最大的好处是, X Client 不需要知道 X Server 的硬件配备与操作系统!因为 X Client 单纯就是在处理绘图的数据而已,本身是不绘图的。所以,在用户端的 X Server 用的是什么硬件?用的是哪套操作系统?服务器端的 X Client 根本不需要知道~相当的先进与优秀~对吧! ^_^ 整个运行流程可以参考下图:用户端用的是什么操作系统在 Linux 主机端是不在乎的!

X Server 用户端的操作系统与 X client 的沟通示意

二、Error constructing proxy for org.gnome.Terminal:/org/gnome/Terminal/Factory0: 无法连接: 拒绝连接

当我解决了第一步的报错,可以正常运行图形界面程序后,我再次运行了我需要的gnome-terminal(创建新终端)这个指令,然后再次报错…

对org.gnome进行了错误的构建代理

我又下了另外一个终端应用:apt-get install terminator

执行terminator后,这次报错的提示具体了一些,显示gnome的客服端没有连接到D-BUS的守护进程,让我有了一定思绪,有时候一些会话需要DBUS。

解决方法:用dbus-launch指令即可

dbus-launch gnome-terminal

图:shell远程连接执行gnome-terminal指令成功

原因在于有些会话需要D-BUS,在https://unix.stackexchange.com/questions/344617/error-constructing-proxy-when-trying-to-launch-gnome-terminal-as-root 这篇文章中有提到

GNOME Terminal现在是一个客户端服务器应用程序。该gnome-terminal程序只是一个客户端,该客户端将Desktop Bus消息构造到服务器,传递其命令行选项,环境,工作目录和参数,然后直接退出。该服务器是在Desktop Bus上gnome-terminal-server注册的服务器org.gnome.Terminal,它负责所有实际的终端仿真并在GUI上显示窗口。

诸如Desktop Bus客户端之类gnome-terminal的客户端通过环境变量来定位Desktop Bus代理,该环境变量通常指向每个用户目录(例如)中的套接字/run/user/1001。或者,环境变量指定要在“当前用户的运行时目录”中查找,并根据客户端进程的有效用户ID构造类似于上述路径。

之所以dbus-launch有效,是因为dbus-launch明确启动了另一个gnome-terminal能够与之对话的Desktop Bus代理。该系统还配置为gnome-terminal-server在客户端尝试通过代理连接到服务器时按需启动服务器。

D-Bus

参考资料:https://www.jianshu.com/p/c073daaf427f

D-Bus是一种高级的进程间通信机制,它由http://freedesktop.org项目提供。D-Bus最主要的用途是在Linux桌面环境为进程提供通信,同时能将Linux桌面环境和Linux内核事件作为消息传递到进程。D-Bus的主要概率为总线,注册后的进程可通过总线接收或传递消息,进程也可注册后等待内核事件响应,例如等待网络状态的转变或者计算机发出关机指令。

D-Bus是一个消息总线系统,其功能已涵盖进程间通信的所有需求,并具备一些特殊的用途。D-Bus是三层架构的进程间通信系统,其中包括:

接口层:接口层由函数库libdbus提供,进程可通过该库使用D-Bus的能力。

总线层:总线层实际上是由D-Bus总线守护进程提供的。它在Linux系统启动时运行,负责进程间的消息路由和传递,其中包括Linux内核和Linux桌面环境的消息传递。

包装层:包装层一系列基于特定应用程序框架的Wrapper库。

总线是D-Bus的进程间通信机制,一个系统中通常存在多条总线,这些总线由D-Bus总线守护进程管理。最重要的总线为系统总线(System Bus),Linux内核引导时,该总线就已被装入内存。只有Linux内核、Linux桌面环境和权限较高的程序才能向该总线写入消息,以此保障系统安全性,防止有恶意进程假冒Linux发送消息。

会话总线(Session Buses)由普通进程创建,可同时存在多条。会话总线属于某个进程私有,它用于进程间传递消息。

D-Bus daemon是D-Bus的非常重要的一个服务,类似于IP网络中的路由器。跟这个后台服务有关的应用程序包括:

dbus-daemon: D-Bus的后台进程,作为D-Bus的消息中转枢纽,可分成system和session两种。

dbus-launch: 启动一个dbus-daemon,后面有不同的参数。一般而言,dbus-daemon启动后需要将其地址告诉给所有需要使用该bus的applications。当系统启动时,需要使用dbus-launch来启动dbus-daemon。

0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论