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