x11转发:通过ssh远程使用GUI程序
我们常常使用ssh服务远程操控服务器,大多数操作我们都可以通过命令行命令来实现。
ssh远程无法查看GUI程序
现在,笔者在x11-test
目录下放入一张图片test.jpg
,并通过opnencv-python
写一个简单的脚本来在图形界面中显示图片。
# test.pyimport cv2img = cv2.imread('test.jpg')
cv2.imshow('test', img)
cv2.waitKey(0)
通常,我们在自己本地的机器上运行该脚本时会正常显示一个窗口,其中是我们的test.jpg
图片。而在远程ssh操作服务器时,我们只能在命令行中执行脚本,并得到报错:
(JJ_env) song@dhu424:~/JJ_Projects/dsmAVA/x11-test$ python test.py
qt.qpa.xcb: could not connect to display
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/song/anaconda3/envs/JJ_env/lib/python3.8/site-packages/cv2/qt/plugins" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.Available platform plugins are: xcb, eglfs, minimal, minimalegl, offscreen, vnc.Aborted (core dumped)
根据报错信息,可以看到,我们的程序脚本时没有问题的,只是由于我们时远程ssh命令行连接,无法显示图片。
x11转发
这时我们就需要通过x11转发来实现远程查看图形界面。我们分别介绍服务器端和客户端的设置,其中服务器端默认为Linux,而客户端则又分为Mac和Linux两种情况。
服务器端设置
-
修改服务器端的ssh设置:
sudo vim /etc/ssh/sshd_config
找到以下内容,取消注释,如果找不到的话直接在下面加上这几行即可:
X11Forwarding yes X11DisplayOffset 10 X11UseLocalhost yes
-
服务器端修改完成后需要执行命令重启sshd服务 :
sudo systemctl restart sshd.service
Mac客户端
-
在Mac上使用x11转发需要下载Xquartz,直接去官网下载dmg文件安装即可。
-
安装好之后可以直接打开终端,连接远程服务器。
注意:与普通的ssh连接不同,要使用x11转发服务,需要在连接时加上
-X
参数,即:ssh -X song@10.199.160.252
然后我们进入
x11-test
目录运行test.py
文件,即可看到x11转发到本地的图形界面窗口:
可以看到,我们要展示的test.jpg
图片成功转发到了我们的本地窗口。
Linux客户端
-
修改客户端的ssh设置:
sudo vim /etc/ssh/ssh_config
添加以下三行:
ForwardAgent yes ForwardX11 yes ForwardX11Trusted yes
-
重启客户端的ssh服务
sudo systemctl restart ssh.service
-
添加
-X
参数连接服务器ssh -X song@10.199.160.252
后面就与Mac端进行类似的测试即可。
Ref:
https://www.cnblogs.com/tsfh/p/9022170.html