远程查看 - 不仅仅是心灵感应
如今,大多数人在使用电脑时都习惯于拥有一个友好、直观的图形环境。使用 DOS 机器或幸运地在 UNIX 大型机上拥有 300 波特的拨号账户的日子已经一去不复返了。今天,大多数人期望能够通过点击来完成工作,即使这项工作是在网络上的其他机器上完成的。在本文中,我将研究一些可用的选项,它们的相对成本和收益,并希望到最后,您应该有足够的信息来选择最适合您的选项。
不过,在开始之前,我可能应该先看看在 Linux 上使用 GUI 实际涉及到什么。绝大多数 Linux 用户将使用 X11 窗口系统(通常简称为 X11)。X11 自 1987 年以来就已存在。从那时起,它经历了多次修订,目前为 R7。您可能遇到的任何 X11 安装都将是 X11R7 的某个版本。已经有人尝试替换它,包括 Wayland、Berlin/Fresco 和 Y 窗口系统,但它们在野外相当罕见,您需要特意去寻找才能遇到它们。
X11 构建在客户端-服务器模型之上。在这个模型中,X11 服务器是实际在物理屏幕上绘制的部分。因此,它是您最终在您面前的桌面上运行的部分。在这个模型中,客户端部分是用户空间程序,它有需要最终用户查看的输出。

图 1. X11 窗口系统(来自维基百科)
客户端通过向 X11 服务器发送请求来完成此操作。这些请求是高级别的,形式为“绘制窗口”、“向窗口边框添加文本”、“将窗口向右移动 x 像素”。因此,如果有很多事情发生,可能会有很多通信。
当大多数人体验 X11 时,这个模型的两个部分都在他们面前的桌面上运行。但是,这不是唯一的选择。客户端和服务器没有理由必须在同一台机器上,甚至在同一个大陆上。因为一切都是通过发送消息来完成的,所以这些消息很容易通过网络连接发送。
您应该想到的第一个想法是“嘿,我可以在我朋友的机器上打开一个窗口,并在那里显示不雅的照片。” 不幸的是,X11 规范的编写者已经预料到这一点,并堵住了这个漏洞。默认情况下,X11 服务器配置为不接受来自网络上客户端的连接。您必须显式允许这样做。您可以使用两种不同的机制来允许外部连接。较旧的一种称为 xhosts。使用 xhosts,您可以告诉 X11 服务器接受来自您允许的服务器的连接。该命令如下所示
xhost +111.222.333.444
较新的身份验证机制称为 xauth。在这种方法中,X11 服务器创建一个 cookie,连接到 X11 服务器时需要该 cookie。如果您想从远程机器连接到 X11 服务器,您需要将此 cookie 复制到远程机器。从 xauth 手册页上的一个示例是
xauth extract - $DISPLAY | ssh otherhost xauth merge -
此命令提取当前 X11 服务器的 cookie,并通过 "SSH" 将其传输到远程机器,并将其合并到用户的 xauth 文件中。
完成此操作后,客户端应用程序如何继续连接到您的 X11 服务器?所有在 X11 下运行的程序都接受某些命令行选项。其中之一是 -display
。使用此选项,您可以告诉您的客户端程序要连接到哪个 X11 服务器并发送其输出。此选项的通用形式为
-display hostname:display#.screen#
此选项的所有部分的原因是,给定的机器可能正在运行多个 X11 服务器,并且每个服务器可能正在运行多个显示屏幕。第一个服务器和屏幕标记为 0.0,因此在大多数情况下,您将使用
-display hostname:0.0
顺便说一句,您可以在桌面上执行此操作。如果您打开终端,则可以使用以下命令运行 X11 客户端程序
-display :0.0
它将显示在您的默认桌面上。
由此产生的一个结果是,您需要连接到将运行客户端程序的远程机器。大多数时候,此连接将通过本地机器和远程机器之间的 SSH 连接。幸运的是,SSH 提供了通过 SSH 连接为您隧道传输 X11 流量的功能。这种隧道传输是“带外”发生的。您通过 SSH 进入远程机器并使用 -X
或 -Y
选项来启动会话。 -X
选项是首选方法。它使用 xauth 作为身份验证系统在远程机器上设置一个安全的 X11 套接字。不幸的是,某些 X11 服务器很难处理这种情况,因此您可以使用 -Y
。这实际上关闭了所有身份验证。它等同于使用 xhost +
。
建立 SSH 连接后,将在远程机器上创建一个新的 X11 套接字,并且环境变量 DISPLAY 设置为指向它。从现在开始,您在此远程机器上启动的任何 X11 应用程序都会将其输出发送到您桌面上的 X11 服务器。当您这样做时,您可能会注意到一些事情。在大多数情况下,它非常慢 - 甚至比慢更慢,如果您连接的机器距离相当远的话。部分由于这个问题,SSH 开发人员包含了一个额外的选项 -C
。这会打开通过 SSH 连接传输的数据的压缩。副作用是,包含 X11 协议指令的发送数据包被捆绑在一起并作为一个单元发送。这使得对可用带宽的使用效率更高,因为您减少了也在线路上发送的控制数据量。
正如我在上面提到的,X11 和通过 SSH 的 X11 都非常慢。在某些情况下,它几乎无法使用。幸运的是,还有另一个可用的选项,VNC。VNC 也遵循客户端/服务器模型,但它颠倒了客户端和服务器的位置,这可能与您习惯的 X11 不同。使用 VNC,您在远程机器上运行服务器,然后在您面前的桌面上使用客户端。您可以在后台运行 VNC 服务器,它像任何其他服务一样运行和操作。它也不使用任何标准的 X11 套接字,因此它不会干扰也可能在远程机器上运行的任何标准 X11 桌面。因为它作为服务运行,所以它可以继续运行,无论您是否连接到它。您可以将其视为旧式备用屏幕的 GUI 版本。
所有主要的操作系统也都有客户端应用程序,并且它们比完整的 X11 服务器轻得多。因此,您可以在远程机器上启动 vncserver,从您的 Windows 机器连接到它,启动一些长时间运行的进程,断开连接并回家,然后从您的 Linux 机器上检查其进度。这是对直接 X11 的巨大改进。此外,您会注意到,在大多数情况下,它比 X11 更具响应性。这是由于 VNC 的客户端和服务器部分之间来回发送的信息量。
服务器命令很简单,就是 vncserver
。当您运行此命令时,如果您的主目录中尚不存在名为 .vnc 的目录,则会创建该目录。如果尚未为此 VNC 服务器实例设置密码,它将要求您输入密码。它以加密形式保存在 passwd 文件中。如果要更改密码,可以使用命令 vncpasswd
。在此目录中,您还应该找到您启动的每个 vncserver 实例的日志文件,以及包含任何当前正在运行的 vncserver 实例的 PID 的 pid 文件。
最后一个感兴趣的文件是 xstartup 文件。当您启动 vncserver 以设置所有必需的选项并布置将在 vncserver 桌面上运行的内容时,将使用此文件。我的 Ubuntu 系统上的默认设置如下所示
#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid grey
#x-terminal-emulator -geometry 80x24+10+10 -ls -title
↪"$VNCDESKTOP Desktop" &
#x-window-manager &
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession
因此,在这种情况下,它将背景设置为灰色,然后尝试运行在全局脚本 Xsession 中定义的任何会话。您可以在这里进行一些编辑并使其成为您自己的。我更喜欢 Fluxbox 作为较小屏幕上的窗口管理器。因此,您可以将其简化为
#!/bin/sh
xrdb $HOME/.Xresources
startfluxbox
启动此程序将为您提供一个外观漂亮的桌面,运行 Fluxbox。如果将要连接到此程序的客户端必须处理较小的屏幕尺寸(例如在上网本上),您可以使用 -geometry
选项在命令行上设置桌面尺寸。您还可以使用 -depth
选项设置虚拟桌面的颜色深度。因此,为了设置一个在我从上网本连接到它时看起来不错的服务器,我将使用它
vncserver -geometry 800x600
现在,另一端呢?有两类通用的 vncviewer 应用程序,GUI 和命令行。GUI 版本,例如 Mac OS X 和 Windows 上最常见的版本,可以点击访问所有相关选项。它们也位于不同的位置,具体取决于谁编写了您特别喜欢的查看器。由于 VNC 是一种协议(有点像 FTP 或 HTTP),因此您从各种实现者那里获得的内容差异很大。让我们在这里看一下命令行版本,看看您可以使用它们做什么。GUI 版本应该具有可比较的可用选项。要连接到 vncserver,您将运行
vncviewer hostname:port
其中 hostname
是远程机器的真实主机名或其 IP 地址。port
是 vncserver 正在侦听的端口号,从 1 开始。此数字添加到默认起始端口号 5900,因此在这种情况下,实际网络端口号为 5901。这将尝试连接到给定的服务器,如果 vncserver 启动期间已设置密码,它将要求输入密码。然后,您将获得一个漂亮的 Fluxbox 桌面。

图 2. 在 vncserver 下运行的 Fluxbox
有很多选项可以更改正在传输的各种部分,例如编码算法、压缩级别和质量级别。调整这些选项可以提高会话的响应速度,但可能会以牺牲一些图像质量为代价。根据您尝试执行的工作,这可能不是您愿意做出的权衡。
虽然您可以强制 VNC 进行某种身份验证,但在当今注重安全的日子里,这可能还不够。您可能必须使用位于防火墙后面的远程机器,该防火墙仅允许 SSH 流量。您能做什么?VNC 允许通过使用 -via gateway
选项通过 SSH 连接隧道传输协议。此网关机器是您要 SSH 进入以进行隧道传输的机器。如果这与您的 vncserver 是同一台机器,则命令如下所示
vncviewer -via user@somehost.com localhost:1
这告诉 vncviewer 以用户 "user" 的身份 ssh
到 somehost.com,然后连接到 somehost.com 本地主机上的 vncserver - 换句话说,somehost.com 本身。没有理由说这些必须是同一台机器。这意味着您可以连接到安全网关机器后面的机器上的 vncserver。在这种情况下,它看起来像这样
vncviewer -via user@gateway.com someotherhost.com:1
请注意,VNC 仍将在 SSH 会话建立后要求您进行身份验证。
结论希望本文为那些在没有友好的图形界面就无法生存的时候提供了一些选择。即使您被迫通过 SSH 连接挤过去,您仍然可以拥有所有出色的 GUI 优点。如果您知道其他在远程机器上获得图形界面的方法,我很乐意听到它们。