作者: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 quilty@192.168.1.104
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 gnosis@gnosis.cx
gnosis@gnosis.cx'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(或者同时连接两者