本地顯示Linux伺服器的GUI程式

tester_ggf發表於2021-01-01

如果我們UI自動化指令碼跑在 Linux 伺服器環境上,這個時候我們是看不到介面的,如果不使用瀏覽器的無頭模式,這個時候我們的程式就跑不起來了,如何在伺服器環境不使用瀏覽器的無頭模式下進行UI測試呢,我們可以通過 MobaXterm 和 X11 Forwarding 遠端顯示伺服器上的圖形化介面(GUI 程式)來實現。

首先我們來認識下什麼是 X11 Forwarding ?它是用來幹嘛的?

以下介紹引用文章:

http://www.ipaomi.com/2017/11/09/%e8%bf%9c%e7%a8%8b%e6%98%be%e7%a4%ba%e6%93%8d%e4%bd%9c-%e6%9c%8d%e5%8a%a1%e5%99%a8-gui-%e7%a8%8b%e5%ba%8f%e5%9b%be%e5%bd%a2%e5%8c%96%e7%95%8c%e9%9d%a2-%e5%9f%ba%e4%ba%8e-x11-forwarding-centos/

X11 Forwarding 介紹

X 協議

img

Linux 本身是沒有圖形化介面的,所謂的圖形化介面系統只不過中 Linux 下的應用程式。這一點和 Windows 不一樣。Windows 從 Windows 95 開始,圖形介面就直接在系統核心中實現了,是作業系統不可或缺的一部分。Linux 的圖形化介面,底層都是基於 X 協議。

X 協議由 X server 和 X client 組成:

  • X server 管理主機上與顯示相關的硬體設定(如顯示卡、硬碟、滑鼠等),它負責螢幕畫面的繪製與顯示,以及將輸入設定(如鍵盤、滑鼠)的動作告知 X client。
  • X client (即 X 應用程式) 則主要負責事件的處理(即程式的邏輯)。

舉個例子,如果使用者點選了滑鼠左鍵,因為滑鼠歸 X server 管理,於是 X server 就捕捉到了滑鼠點選這個動作,然後它將這個動作告訴 X client,因為 X client 負責程式邏輯,於是 X client 就根據程式預先設定的邏輯(例如畫一個圓),告訴 X server 說:“請在滑鼠點選的位置,畫一個圓”。最後,X server 就響應 X client 的請求,在滑鼠點選的位置,繪製並顯示出一個圓。

X11 Forwarding

img

這麼繞,有啥意義呢?當然有!

許多時候 X server 和 X client 在同一臺主機上,這看起來沒什麼。但是, X server 和 X client 完全可以執行在不同的機器上,只要彼此通過 X 協議通訊即可。於是,我們就可以做一些“神奇”的事情,比如像本文開頭談到的,在本地顯示 (X server),執行在伺服器上的 GUI 程式 (X client)。這樣的操作可以通過 SSH X11 Forwarding (轉發) 來實現。

X11 中的 X 指的就是 X 協議,11 指的是採用 X 協議的第 11 個版本。

MobaXterm 工具

img

那 MobaXterm 又是什麼鬼?MobaXterm 是一款開源、免費的、全功能終端軟體。它與 PuTTY 類似,但卻比 PuTTY 要強大得多,其中一個很實用的功能就是 MobaXterm 自帶 X Server。這樣我們就不用勞神地去想怎麼在 Windows 上啟動 X server 了。

MobaXterm官網:https://mobaxterm.mobatek.net/

MobaXterm 下載:https://fenxiangdayuan.lanzous.com/ijMPOjxb43a

小結一下,整個實現邏輯就是:

本地機器採用 MobaXterm (自帶 X server) 連線遠端伺服器。然後,在伺服器上執行 GUI 程式 (即 X client),通過 SSH X11 Forwarding,轉發到本地 (Windows 機器上)。

Centos7 + X11 Forwarding + MobaXterm 環境搭建

伺服器端

安裝 X11 Forwarding 相關軟體,執行命令:

yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 xclock

啟用 X11 Forwarding, 需要修改 ssh 的配置資訊,如下

vi /etc/ssh/sshd_config

將 X11Forwarding 和 X11UseLocalhost 前面的 # 去掉,並將 X11Forwarding 設定為 yes,X11UseLocalhost 設定為 no :

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
X11UseLocalhost no

重啟 sshd 服務:

systemctl restart sshd.service

本地 (Windows 端)

下載並安裝好 MobaXterm ,建立一個session,填寫對應的配置資訊遠端連線到伺服器

image-20210101180419153

img

注意到 X11-forwarding 和 DISPLAY 這兩項都打上了綠色的勾,代表設定成功了。

驗證

在伺服器端執行一個 GUI 程式,例如輸入命令:

xclock

這時候,你在本地 (Windows 端),就可以看到相應的圖形化介面(視窗)

img

那麼在我們執行 UI自動化指令碼的時候,就可以在本地(Windows 端)看到瀏覽器的執行過程了,例如在 Linux 系統啟動 chrome 瀏覽器訪問百度地址,輸入命令:

chrome --no-sandbox https://www.baidu.com

我們就能看到開啟如下介面了:

image-20210101182752425

中文顯示問題

如果開啟的瀏覽器中文顯示不出來(顯示的都是小方塊),這是因為伺服器字型庫沒有對應字型的問題,參考下面的文章解決:

X11 Forwarding顯示中文:

https://www.maixj.net/ict/x11-forwarding-zhongwen-23067

相關文章