内容


在 Linux(或异构)网络上共享计算机,第 1 部分

比较“安全 shell(SSH)”和“虚拟网络计算(VNC)”

Comments

为有效地测试各种软件程序和撰写关于它们的文章,我在自己的本地网络上配备了大量计算机。这些机器运行各种操作系统并使用各种硬件配置。有时我会在各种平台上评测工具;而有时候会测试和调试自己编写的工具。

我网络上的大多数机器都以多重引导配置的方式安装了多种操作系统,但也有一些是“无头的”(无监视器或键盘)。虽然多重引导装入器适于容纳多种操作系统,但由于只在一台机器上进行测试,重新引导的时间开销使得多平台的详细比较测试花费了更多时间。多重引导不太利于“并排”比较。我没有评测过任何让您在一个系统内“虚拟”另一个系统的工具,譬如 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。完成这个操作的非安全工具是 telnetrsh ,但使用这些工具会引起很多安全性问题,因此最好在所有需要通信的计算机上安装 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)”影响,但是交互式 cursesslang 类应用程序通常会受影响。这些应用程序中最值得注意的是文本编辑器,它通常是您最需要在远程控制台上运行的应用程序。顺便说一下, 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 (或者同时连接两者)。如果愿意,也可以显式地指定 192.168.1.106:1

相同的的原则也适用于非本地网络,并且出于安全性目的,VNC 可以配置成隧道通过 SSH。

大多数情况下,具有一个到远程计算机的 vncviewer 连接,在功能上和坐在该远程计算机的本地监视器和键盘前面一样(假定它不是“无头的”)。从美学角度来看,将通过一个使用本地机器的小窗口(widget)的窗口来构造远程系统的桌面(除非使用全屏选项)。最初这些额外的框架可能会分散一些注意力,但是使用了一段时间后,就很容易忽略它们了。

选择适当的会话图形分辨率和色深很重要(假定您正在使用 Xvnc 服务器,就会有一个选项;或者在其它 vncserver 平台上,您希望将远程计算机的本地显示设定为适合自己的 VNC 需要的分辨率)。远程桌面分辨率越小,使用的色彩越少,则显示响应就越快。这样,屏幕资源对于许多应用程序来说是理想的。我发现减少色深对响应速度的影响比较小;VNC 的十六进制编码比简单的“象素到象素”屏幕传输的效率高得多。但是屏幕大小出现了明显差异。

通常,我发现使用诸如 1260x940 以上的远程图形分辨率和本地 1280x1024 视频设置配合的非常好。我只留了一点额外空间以放置 VNC 标题栏和本地桌面任务栏。但是 vncviewer 窗口依然占用着 几乎整个屏幕,这很漂亮。在 100 Mbit 以太网连接的情况下,这种连接几乎丝毫不逊于本地显示。在 10 Mbit 以太网上,当移动和缩放窗口时,可以看到轻微的延迟。在速度更慢的情况下,VNC 往往不是远程操作的最佳解决方案。电缆、DSL 或者 T1 连接仍然可用,但不是无缝的。任何比这些连接更慢的连接实际上只能用于紧急情况。

VNC 连接的一个问题是本地桌面出于自己的用途需要使用一些击键。许多远程击键可能必须使用组合击键操作来模仿,这取决于特定客户机。例如,我的本地 OS/2 vncviewer 需要按 Alt-A, F, Alt-A 来输入远程 Alt-F 。这些额外的敲击有时对于打字员来说难以适应。在非 PC 平台(例如 Mac)下情况更为复杂,因为它们有自己的键盘和(单键)鼠标。还有很多东西要学习和输入,但是通常会有一个方法来模仿所有远程输入动作。但是,Linux 到 Linux 连接工作得十分平稳。通常只有少数组合键没有直接传递到远程会话,这取决于连接两端所用的特定窗口管理器。

一个值得注目的 VNC 实现是 Java 版。有许多本机版本可用,即使那些没有本机 vncviewer 的平台也可以使用 Java 版(假定存在用于该平台的 JVM)。VNC-java 可以在 Web 浏览器内运行,Web 浏览器提供了建立连接的常见界面。但是 Java 查看器也可以作为 Java 应用程序在浏览器外部运行。下面的 参考资料提供了一些关于 VNC-java 的额外信息,包括我创建的一个压缩文档,它也许有助于一些用户开始学习。

下一次

在第 2 部分中,我们将研究远程 X 和其它跨网络运行远程应用程序的方法,还有使用远程应用程序时的安全性问题。


相关主题

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.
  • 商业和正式版本的 SSH 是由 SSH Communications Security 推出的。有一个可以免费用于非商业用途的版本,但它不是“自由软件”。
  • 大多数 Linux 分发版封装的却是 OpenSSH。因为许可证是从各种地方继承的,所以它有一点复杂,但却是“类 BSD”的。
  • 对于 Windows,我建议使用“自由(MIT 许可证)软件”程序 PuTTY。它很棒并且安装也容易。
  • 对于 BeOS 和 OS/2,我建议在 BeBits.comHobbes OS/2 archive 上分别搜索。对于 MacOS,我使用过 MacSSH,但是关于 Nifty Telnet 1.1 SSH,我无法提出意见。请在 FreeSSH 网站上查看关于 MacOS 的链接。
  • 有些读者可能希望使用 VNCviewer 的 Java 版本,但是在他们的机器上只有 Java 运行时环境,而没有 javac 开发工具。David Mertz 已经创建了(完全未受支持)一套已编译的字节码 .jar.class 文件 ,欢迎您尝试。
  • David Mertz 还在 developerWorks 上发表过关于加密概念的由三部分组成的教程,该教程提供了本文中讨论 ssh 时提及的“公钥加密”的背景知识:

评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=21644
ArticleTitle=在 Linux(或异构)网络上共享计算机,第 1 部分
publish-date=12012001