「Mac&Linux」一次基于X和蒲公英組網(wǎng)的遠(yuǎn)程桌面嘗試
因?yàn)槟承┰蛭冶仨氃谶h(yuǎn)程條件下使用帶圖形環(huán)境的Ubuntu工作。雖然說(shuō)有向日葵和ToDesk這種遠(yuǎn)程控制工具,但是后者經(jīng)常莫名其妙蹦個(gè)錯(cuò)誤告訴我連不上網(wǎng)絡(luò)(指的是Mac上的這個(gè)軟件連不到它公司自己的網(wǎng)絡(luò),連我這個(gè)賬號(hào)在ToDesk上有哪些在線設(shè)備都不知道),前者怎么說(shuō)呢... 我已經(jīng)受夠遠(yuǎn)程桌面那模糊的畫質(zhì)和時(shí)長(zhǎng)時(shí)短的操作時(shí)延了!
我打算試試用VNC或X這種遠(yuǎn)程窗口方案。
ssh登錄
網(wǎng)絡(luò)拓?fù)涫沁@樣的:
(Macbook筆記本) —— (Windows筆記本) —— (Ubuntu 22.04 虛擬機(jī))
其中Ubuntu是Windows上基于VMware運(yùn)行的虛擬機(jī),而且Macbook和Windows分別在兩個(gè)大內(nèi)網(wǎng)里,沒(méi)法直連,這里采用貝銳蒲公英提供的遠(yuǎn)程組網(wǎng)方案(內(nèi)網(wǎng)穿透好幫手),分別在Macbook和Windows上安裝并運(yùn)行蒲公英,具體的教程就不需要展示了。
為了描述方便,下面Macbook簡(jiǎn)稱Mac,Windows簡(jiǎn)稱Win,Ubuntu簡(jiǎn)稱VM。
總之,通過(guò)蒲公英兩邊都得到了一個(gè)虛擬局域網(wǎng)的IP,暫定為Mac得到了172.111.1.14而Win是172.111.1.15。同時(shí)Win和VM處于同一個(gè)由VMware構(gòu)成的虛擬網(wǎng)絡(luò)中,在這個(gè)網(wǎng)絡(luò)中假定Win是192.168.168.1,VM是192.168.168.136。通過(guò)實(shí)驗(yàn)可以確認(rèn)Mac和Win、Mac和Ubuntu、Win和VM都是具有網(wǎng)絡(luò)可達(dá)性的(可以互Ping成功),說(shuō)明蒲公英組網(wǎng)之后可以正確地修改路由表,使得虛擬局域網(wǎng)中的Mac和虛擬局域網(wǎng)外的VM都能互相發(fā)現(xiàn)。
好,抽象的事情要來(lái)了。我們先試試能不能從Mac用ssh連接VM:(所有涉及用戶名的地方都用gua代替)
~/ $ ssh gua@192.168.168.136
kex_exchange_identification: read: Connection reset by peer
Connection reset by 192.168.168.136 port 22
我的第一個(gè)想法是:莫非VM設(shè)置出了問(wèn)題,不允許連接?挨個(gè)排查:
- Mac和Win之間的網(wǎng)絡(luò)可達(dá)性:互Ping有應(yīng)答,沒(méi)問(wèn)題
- Win和VM之間的網(wǎng)絡(luò)可達(dá)性:互Ping有應(yīng)答,沒(méi)問(wèn)題
- Mac和VM之間的網(wǎng)絡(luò)可達(dá)性:互Ping有應(yīng)答,沒(méi)問(wèn)題
- VM自身的sshd網(wǎng)絡(luò)設(shè)置:從Win用ssh登錄VM成功,沒(méi)問(wèn)題
- 蒲公英鏈路不允許ssh:從Mac用ssh登錄Win成功,不太像是主動(dòng)的限制
- Win本身對(duì)ssh鏈路的影響:從Mac用ssh把Win作為跳板登錄VM成功,不太像是Win的鍋
顯然,我覺(jué)得各個(gè)環(huán)節(jié)都不太可能有問(wèn)題,除非:蒲公英虛擬組網(wǎng)本身有缺陷,或者Win作為網(wǎng)絡(luò)節(jié)點(diǎn)會(huì)對(duì)ssh鏈路產(chǎn)生影響。
考慮到蒲公英之前在Linux上的服務(wù)端做得實(shí)在是太爛了,我傾向于是前者。
那么,現(xiàn)在就只能用這種指令訪問(wèn)了。
~/ $ ssh -J gua@172.111.1.15 gua@192.168.168.136
然后它成功了,難評(píng)蒲公英。
設(shè)置X遠(yuǎn)端顯示
X是一套歷史悠久的視窗顯示體系,現(xiàn)在主流的版本號(hào)是11,因此也叫X11。在X11里面:
- X Server是提供顯示資源的一端,即提供顯示器、鍵鼠輸入信號(hào)的一端。
- X Client是需要顯示資源的一端,通常指的是應(yīng)用程序,因?yàn)槭菓?yīng)用程序有顯示畫面、接受輸入信號(hào)的需求。
- X Protocol是所用的X協(xié)議,體系里有這么個(gè)概念,但是我們?cè)诖瞬挥脙A注過(guò)多關(guān)注。
在一般的使用場(chǎng)景里,通常是用戶需要讓遠(yuǎn)端服務(wù)主機(jī)上的應(yīng)用程序(遠(yuǎn)端主機(jī)通常配置很強(qiáng)性能更好,因此跑計(jì)算任務(wù)都在遠(yuǎn)端主機(jī)上)在本地主機(jī)上顯示畫面(在本地主機(jī)上繪制Python跑出來(lái)的曲線圖之類的)。在這個(gè)場(chǎng)景中,遠(yuǎn)端主機(jī)上輸出畫面的應(yīng)用程序是X Client,而本地主機(jī)則需要運(yùn)行X Server。
這里Mac上運(yùn)行X Server,接收來(lái)自VM上的X Client們的畫面信號(hào)。
選擇合適的X Server程序
帶有X Server的程序有很多,在Windows上有MobaXterm(內(nèi)置X Server)和PuTTY、VcXsrv(用X Launch啟動(dòng))等。其中以VcXsrv最為經(jīng)典,可以設(shè)置X Server所使用的Display號(hào)和Screen號(hào)。由于我是在Mac上運(yùn)行X Server,這里用的是XQuartz。
有個(gè)小坑點(diǎn),這里如果用 brew install --cask XQuartz 如果網(wǎng)絡(luò)變化的話會(huì)安裝一個(gè)殘缺的XQuartz,而你重新用 brew 安裝并不會(huì)告訴你有什么異常,也不會(huì)重新給你裝好,因此建議去官網(wǎng)下載 .pkg 包進(jìn)行安裝。
在X體系里,最重要的環(huán)境變量是 $DISPLAY ,這個(gè)變量決定了X應(yīng)用程序會(huì)往哪個(gè)方向建立X連接。在我們所要進(jìn)行的整個(gè)過(guò)程中,你都沒(méi)有任何必要手動(dòng)修改這個(gè)變量。這是因?yàn)椋篨Quartz會(huì)自動(dòng)修改你在Mac上的 $DISPLAY;而如果你使用 ssh -Y 連接遠(yuǎn)端主機(jī), ssh 會(huì)自動(dòng)幫你修改遠(yuǎn)端主機(jī)上的 $DISPLAY 數(shù)值。
# 在Mac上,當(dāng)你從Launch Pad直接運(yùn)行完XQuartz,會(huì)得到...
~/ $ echo $DISPLAY
/private/tmp/com.apple.launchd.57Nwhjt3kp/org.xquartz:0
# 得到形如上一行的文本
# 在遠(yuǎn)端主機(jī)上,當(dāng)你直接使用ssh連接而不配置任何X轉(zhuǎn)發(fā)選項(xiàng)時(shí),會(huì)得到...
~/ $ echo $DISPLAY
# 得到空白,說(shuō)明沒(méi)有設(shè)置
# 在遠(yuǎn)端主機(jī)上,當(dāng)你使用 ssh -Y 連接時(shí),會(huì)得到...
~/ $ echo $DISPLAY
localhost:10.0
# 得到這個(gè),說(shuō)明ssh -Y主動(dòng)設(shè)置了DISPLAY變量
# 當(dāng)你用VMware直接在有圖形界面的Ubuntu里運(yùn)行終端時(shí),會(huì)得到...
~/ $ echo $DISPLAY
:0
# 得到這個(gè),這是因?yàn)橛昧四J(rèn)的本地顯示器,在本地進(jìn)行顯示
當(dāng)X Server所在的本地主機(jī)和X Client所在的遠(yuǎn)端主機(jī)的 $DISPLAY 變量都被正確設(shè)置時(shí),X方面就沒(méi)什么太大的問(wèn)題了。
Mac:使用X Quartz實(shí)現(xiàn)遠(yuǎn)程窗口
Mac上的X Quartz的使用具有比較鮮明的特色。怎么說(shuō)呢... 用起來(lái)感覺(jué)像“訪達(dá)”。XQuartz自己是一個(gè)程序,而遠(yuǎn)端的X Client所產(chǎn)生的窗口則是屬于這個(gè)程序的子窗口。
使用X Quartz在Mac上實(shí)現(xiàn)遠(yuǎn)端窗口的基本步驟如下:
- 啟動(dòng)XQuartz,它應(yīng)該在“應(yīng)用程序” -> “其他”或者“實(shí)用工具” 里。如果XQuartz很快就退出了,建議重裝一個(gè)。
- 在XQuartz中啟動(dòng)終端

- 在終端中使用
ssh -Y gua@192.168.168.136連接所需要的遠(yuǎn)端主機(jī) - 在終端中執(zhí)行需要X Server的命令,這時(shí)候就會(huì)在你的本地主機(jī)創(chuàng)建窗口了

值得注意的是,其中的 ssh -Y 在man手冊(cè)中被指出是 “Trusted”。我一開始以為是通過(guò) -Y 的話要額外經(jīng)過(guò)身份驗(yàn)證之類的,后來(lái)細(xì)究了一下發(fā)現(xiàn) -Y 類似裸奔模式: -X 只允許部分X Client的操作,而 -Y 則沒(méi)有這種限制。因此比較正經(jīng)的教程通常會(huì)告訴你應(yīng)該多用 -X 避免安全問(wèn)題,而網(wǎng)上的文章通常都會(huì)建議你用 -Y 避免在奇怪的地方被莫名其妙地?cái)r住。
這樣的步驟只是讓讀者快速了解實(shí)現(xiàn)遠(yuǎn)端窗口的全部流程,細(xì)究起來(lái)還是有很多問(wèn)題,比如:
- XQuartz的終端非常難看,不能正確地顯示我的Powerline字體。
- 在
.ssh/config中為目標(biāo)主機(jī)配置快捷啟動(dòng)和ForwardX11Trusted yes好像沒(méi)有起到和-Y一樣的用處,有待研究。
此外,這樣做的延時(shí)是比較恐怖的。雖然繪制的效果不錯(cuò),但是上面那個(gè)示意圖中xeyes對(duì)鼠標(biāo)的跟蹤效果的延時(shí)高達(dá)800ms;我通過(guò)終端啟動(dòng)QtCreator之后,有關(guān)操作的延時(shí)可以高達(dá)13.92s。這樣的延時(shí)多少有點(diǎn)不可接受了。
有機(jī)會(huì)再做個(gè)對(duì)比實(shí)驗(yàn),看看網(wǎng)絡(luò)鏈路在其中的影響有多大。

浙公網(wǎng)安備 33010602011771號(hào)