分類: Linux

Guacamole:透過瀏覽器以網頁介面遠端操控電腦,支援 VNC 與 RDP 協定

Guacamole 是一個以 HTML5 為基礎的遠端桌面 gateway,讓你只需要使用瀏覽器就可以操控遠端的電腦,功能就像傳統的 VNC 與 RDP 一樣。

Guacamole 是一個以 HTML5 為基礎的網頁應用程式(web application),使用者可以透過這個網頁應用程式並配合遠端桌面的傳輸協定(例如 VNC 或 RDP)來操控遠端的電腦。

除了網頁應用程式之外,Guacamole 也是一個專案名稱,這個專案的內容就是發展一套 API 提供給 Guacamole 網頁應用程式使用,而這個 API 亦可用於其他類似的應用程式或服務。

網頁應用程式(Web Application)

一般談到 Guacamole 一詞,通常是指以 Guacamole API 為基礎所發展出來的網頁應用程式,而這個網頁應用程式事實上是遠端操控系統中的一環,Guacamole 配合整個系統即可建立一個支援各種協定的遠端桌面 gateway。

由於 Guacamole 只使用到 HTML5 與一些其他的標準,讓 Guacamole 在 client 端只需要新的瀏覽器,即可透過網路操控遠端電腦的桌面。

在以前 Guacamole 是一個單純的 HTML5 VNC client,而在更之前的版本,它還只是一個由 JavaScript 寫成的 telnet client,稱為 RealMint,但現在的 Guacamole 已經是完全不同的東西了,目前它的架構大幅成長後,已經涵蓋各種遠端桌面的協定,亦可同時操控多台電腦,非常實用,甚至 Guacamole 的開發者也是使用它來在遠端的電腦做開發。

Guacamole API

Guacamole 專案將其所開發出來的 API 用於網頁應用程式上,也就是上述的 Guacamole 網頁應用程式,雖然這個應用程式是 Guacamole 最大的賣點之一,但是這個專案所發展的 API 也不容小覷,尤其是要將 HTML5 遠端操控電腦的功能,整合至現有的應用程式或系統架構時,這樣的 API 會是一個非常有用的工具。

Guacamole API 提供了一個以 JavaScript 為基礎的通道(並非使用 WebSocket),讓你可以很方便且有效率的做文字資料的串流(streaming),另外它也實做了一個支援 Guacamole 傳輸協定的 client,這個 client 可以接收經過通道傳輸的 Guacamole 串流資料,然後將遠端電腦的畫面呈現在瀏覽器中。

另外,這個 API 也提供跨瀏覽器的滑鼠與鍵盤事件(events)、螢幕鍵盤與支援硬體加速 compositing 的 synchronized nestable layers。

一般有 HTML5 遠端桌面需求的專案,可以直接使用 Guacamole API 所提供的功能,這樣可以省去非常多開發上的時間。

實作與架構


事實上 Guacamole 並不是一個單純的網頁應用程式,它是由好幾個部份組合而成的架構,許多功能都是由一些比較低階的組件所提供的。

Guacamole 通訊協定(protocol)

Guacamole 網頁應用程式本身並不支援任何遠端桌面的通訊協定,當然也不支援 VNC 或 RDP 等,它本身只有支援自己的 Guacamole 傳輸協定,這個協定包含遠端畫面的繪製(remote display rendering)與事件(event)的傳遞,然而一個包含這兩種功能的協定事實上就跟一般的遠端桌面協定有同等的功能,只是 Guacamole 協定在設計理念上跟一般的遠端桌面協定有些不同,Guacamole 的目標是希望可以相容於各種桌面環境。

Guacamole 中實作了各種遠端桌面協定中的功能,並且加入一些特定的遠端桌面協定支援(例如 RDP 與 VNC 等),而一般的遠端桌面協定與 Guacamole 之間則是透過一個 middle layer 來轉換,實作這個轉換的程式實際上就是撰寫一個遠端桌面的 client,只不過將原本顯示在本機的畫面透過 Guacamole 協定傳送到遠端。

guacd

guacd 就是上述 middle layer 中負責轉換的程式,這個程式是 Guacamole 最主要的核心,它可以動態載入各種不同的遠端桌面協定支援(也稱為 client plugin),並且使用這些協定依照網頁應用程式所傳回的指令,連線到遠端被控制的電腦。

在技術層面上,guacd 是一個伴隨 Guacamole 的 daemon process,它會在背景執行並且傾聽來自於網頁應用程式的 TCP 連線。這個 guacd 不直接支援任何遠端桌面協定,而是只有支援基本的 Guacamole 協定,在需要的時候才去載入指定的遠端桌面協定 client plugin。

當 guacd 載入 client plugin 之後,client plugin 會自己獨立執行,並且全權控制所有與網頁應用程式之間的連線,直到 client plugin 執行結束為止。

guacd 與所有的 client plugins 都會需要一個共同的 libguac 函式庫,這個函式庫可以讓程式開發者更容易使用 Guacamole 傳輸協定。

網頁應用程式(Web Application)

在 Guacamole 架構中跟使用者最接近的就是網頁應用程式的部份,就像上面所提過的,這個網頁應用程式並不包含任何遠端桌面協定的支援,它只是一個前端的使用者介面,實作基本的圖形介面與使用者認證而已,真正的遠端桌面操控都是靠著 guacd 來處理。

目前在伺服器端的網頁應用程式是以 Java 來實作,但是其實也可以使用其他語言,畢竟 Guacamole 本質上是一個 API,所以它也希望可以支援不同的語言。

參考資料:Guacamole

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Recent Posts

光陽 KYMCO GP 125 機車接電發動、更換電瓶記錄

本篇記錄我的光陽 KYMCO ...

2 年 ago

[開箱] YubiKey 5C NFC 實體金鑰

本篇是 YubiKey 5C ...

2 年 ago

[DIY] 自製竹火把

本篇記錄我拿竹子加上過期的苦茶...

3 年 ago