作者:David Mertz 比較“安全 shell(SSH)”和“虛擬網絡計算(VNC)” 在這兩篇文章的第一篇中,David 比較和對照了“安全 shell(SSH)”和“虛擬網絡計算(VNC)”,這兩種技術允許用戶在一台工作站上運行位於另一台計算機上的應用程序。(他沒有涉及文件和打印共享或諸如 httpd、FTPd、smtp 或 nntpd 之類的“因特網”服務,雖然這些技術也可以有效地“共享”上述計算機中的某些資源。)然而,他確實給出了 SSH 和 VNC 的安裝和配置的提示,並評論了工具的穩定性、選項和許可證狀況。 為有效地測試各種軟件程序和撰寫關於它們的文章,我在自己的本地網絡上配備了大量計算機。這些機器運行各種操作系統並使用各種硬件配置。有時我會在各種平台上評測工具;而有時候會測試和調試自己編寫的工具。 我網絡上的大多數機器都以多重引導配置的方式安裝了多種操作系統,但也有一些是“無頭的”(無監視器或鍵盤)。雖然多重引導裝入器適於容納多種操作系統,但由於只在一台機器上進行測試,重新引導的時間開銷使得多平台的詳細比較測試花費了更多時間。多重引導不太利於“並排”比較。我沒有評測過任何讓您在一個系統內“虛擬”另一個系統的工具,譬如 VMWare、Plex86、VirtualPC、SheepShaver 或者其它工具。在某些方面,這些工具實現了我將在本文中討論的那些工具的用途。 有幾種不同的技術允許用戶在一台工作站上運行位於另一台計算機上的應用程序。SSH 提供到遠程計算機的文本終端;可以使用“X Window 系統”在一些工作站上顯示交互式應用程序,而這些應用程序實際上運行在另一台工作站上;VNC 可以作為對於整個遠程桌面的“遠程控制”。每種技術都有優點和缺點。它們都在 Linux 上運行,但不同變體(主機或遠程)允許與其它各種 OS 環境(用於異構網絡)進行交互。使用這些工具的組合,我可以坐在一台工作站(具有最好的監視器、鍵盤和椅子的那一台)前,運行、測試並對多個平台上(通常不用重新引導任何系統)的應用程序進行計時。 我的網絡設置 我的本地網絡上有七個節點,命名為 Apollo、Bacchus、Chaos、Delphi、Echo、Fury 和 Gaia。分別為這些節點分配了從 192.168.1.101 到 192.168.1.107 的 IP 地址。大多數情況下,同一物理機器在多重引導到不同操作系統時總是獲得相同 IP 地址(但有時我使用 DHCP,它分配 192.168.1.200 以上的地址)。整個網絡位於一個硬件防火牆/路由器後,我充分信任防火牆,對於運行在本地機器上的服務,我也許並沒有象應有的那樣過分猜疑。(需要在因特網上共享計算機的讀者應該比我更擔心安全性問題。這兩篇文章中的第二部分加入一些關於安全性問題的討論。) 我提及了上面的大部分細節,以便您可以遵循我在下面給出的一些 shell 示例。我實際操作的機器是 Bacchus,它的本地 IP 地址是 192.168.1.102。 安全 shell(ssh) 最節省帶寬的連接計算機方法是通過簡單文本 shell。完成這個操作的非安全工具是 telnet 和 rsh,但使用這些工具會引起很多安全性問題,因此最好在所有需要通信的計算機上安裝 ssh。盡管下面的一些示例在我的防火牆之內使用了 telnet,但這種折衷辦法也是以下事實的產物 ― “Fury”目前專用於安裝和重新安裝測試操作系統。缺省情況下,許多類 UNIX 操作系統(包括最新的 Linux 分發版(distribution))將安裝 ssh;如果沒有安裝,請參閱本文後面的參考資料來安裝它。 安全 shell(ssh)對通過特定通道的所有信息流都進行加密。因為使用了公鑰(public-key)加密,所以,服務器和客戶機不必在會話開始(initiation)之前共享密鑰。此外,機密不會在通道中以未加密格式傳輸(譬如,使用 telnet 傳輸登錄密碼則任何攔截器都可以截獲它)。其它協議 ― 例如 VNC 或 X Window ― 可以位於 ssh 頂部,但是這些協議最簡單的用途是用於創建遠程文本控制台。 使用 ssh,可以輕易地連接到與本地機器運行不同操作系統的機器上。唯一的要求是,遠程機器運行 sshd 服務器,而本地機器要有 ssh 客戶機。例如,要從運行 OS/2 Warp 的“Bacchus”機器連接到隔壁運行 Slackware Linux 的“Delphi”機器,就象下列清單一樣簡單: 使用 ssh 通過 HOSTS 名稱連接到遠程機器 C:\UTILS % ssh quilty@delphi Last login: Thu Nov 29 01:41:36 2001 from 192.168.1.102 Linux 2.2.19. quilty@delphi:~$ exit logout Connection to delphi closed. 如果我的 HOSTS 文件未定義別名,可以使用: 使用 ssh 通過 IP 連接到遠程機器 C:\UTILS % ssh
[email protected] Last login: Thu Nov 29 01:51:31 2001 from 192.168.1.102 Linux 2.2.19. quilty@delphi:~$ 同樣地,我經常通過使用下列命令跨越國界,在全世界管理我租用的 Web 服務器: 使用 ssh 通過 DNS 名稱連接到遠程機器 C:\UTILS % ssh
[email protected] [email protected]'s passWord: 對於異構平台上的 ssh 來說,最困難的事情是正確地獲得終端配置。實際上,這個問題並不是 ssh 本身的問題(telnet 也有同類的問題)。將兩台 Linux 機器連接在一起幾乎總是能無縫地工作。但是將安裝其它平台的機器作為客戶機或服務器時,顯示總是不太正確,或者鍵綁定不象預期的那樣工作。當涉及“非類 UNIX”平台諸如 Win32、BeOS、MacOS 和 OS/2 時,問題似乎尤其嚴重,但即使將 FreeBSD 與 Linux 連接也有缺點。 當在異構機器之間創建 ssh 連接時最典型的問題是代碼頁錯誤,或者色彩轉義碼錯誤。當任何一種情況發生時,基本命令行可用,但是線條(line-draw)字符顯示成其它東西;經常只能看到單色終端而不是彩色的。shell 命令不大受這種“阻抗失諧(impedance mismatch)”影響,但是交互式 curses 或 slang 類應用程序通常會受影響。這些應用程序中最值得注意的是文本編輯器,它通常是您最需要在遠程控制台上運行的應用程序。順便說一下, jed 是一種特別好的遠程文本方式編輯器;其強壯內核也許將使用 vim。其它大多數 Linux/UNIX 編輯器不是基於 X 的就是極其粗糙的(或者是臃腫的,如 emacs)。 如果您遇到終端配置問題,就需要做幾件事。如果您是在連接到類 UNIX sshd 服務器時出問題,請嘗試更改遠程 TERM 環境變量。例如: 常用遠程終端設置 quilty@delphi:~$ TERM=vt100 quilty@delphi:~$ TERM=ansi quilty@delphi:~$ TERM=linux 同時,本地 ssh 客戶機通常會有辦法來配置連接的終端類型。它可能是命令行選項、環境變量或菜單對話框,這取決於平台和客戶機程序。您在連接的兩端不應該使用完全相同的名稱。要反復進行試驗。還應該檢查以確保在客戶機配置內使用了“無代碼頁轉化”。要測試“阻抗匹配(impedance match)”,則嘗試運行一個全屏遠程應用程序(例如 jed 或者另一個編輯器)。 虛擬網絡計算(Virtual Network Computing(VNC)) VNC 是一種已經移植到許多 GUI 平台上的客戶機/服務器系統。VNC 提供一種在本地系統上顯示遠程計算機整個“桌面”的輕量型協議。Symantec 的 pcAnywhere 是一種具有類似用途的商業產品,但是它僅限於 Microsoft 操作系統。相反,VNC 才真正可以在許多不同的操作系統上運行,並有多種實現和變體。 獲得對 VNC 的感性認識的一個好方法是看它網站上的抓屏(請參閱參考資料)。可能的組合比那裡顯示的多得多,但是顯示的多個變體表明了多數。通常, 任何具有 VNC 客戶機(通常稱為 vncviewer)的平台可以在本地窗口內顯示任何具有 VNC 服務器(vncviewer)的平台的虛擬桌面。調整大小和全屏選項也許可用,這取決於 VNC 客戶機的版本。 VNC 服務器的基於 X 的版本(Xvnc)和用於其它平台的版本之間有一點差異。單用戶系統諸如 Windows、MacOS、BeOS 和 OS/2 不具備“X Window 系統”所擁有的“桌面會話”概念。因此,例如 Windows VNC 服務器所顯示的只是出現在與本地系統上的同一個 Windows 桌面的遠程版本;當連接時這稱為“桌面:0”。相反,X Window 是多用戶和多會話的。每個 Xvnc 會話創建一個全新的桌面,可能有它自己的分辨率、窗口管理器和狀態。換言之,X 對 VNC 的支持要好得多。 一旦安裝了 VNC 服務器,啟動會話很簡單而且安裝也很容易;請參閱參考資料。對於單用戶平台,由於基本上只運行應用程序,所以沒有選項(第一次您將需要設置一些許可權)。在 X 下,一些命令行選項會有幫助。例如,我已經連接了一個從本地 OS/2 Warp“Bacchus”機器到 Mandrake Linux“Fury”機器的 telnet 會話,如下所示: 在 Fury 上啟動 VNC 服務器會話 [root@fury quilty]# cat /usr/bin/vnc-sessions vncserver -name TinyLinux -depth 8 -geometry 640x480 vncserver -name BigLinux -depth 32 -geometry 1260x940 [root@fury quilty]# vnc-sessions New 'TinyLinux' desktop is fury.gnosis.lan:1 Starting applications specified in /root/.vnc/xstartup Log file is /root/.vnc/fury.gnosis.lan:1.log New 'BigLinux' desktop is fury.gnosis.lan:2 Starting applications specified in /root/.vnc/xstartup Log file is /root/.vnc/fury.gnosis.lan:2.log 現在,我可以從客戶端使用本地 vncviewer 連接到 Fury:1 或者 Fury:2(或者同時連接兩者