第八章:X转发

类Unix系统使用X协议(或X11)来显示图形用户界面。

X多年来有所改进,但它仍然以巴洛克风格而闻名。

X的一个更有用的功能是将程序运行的系统与程序显示的系统分开。你可以在一台主机上运行程序,并使显示出现在完全不同的工作站上。我可以在公共互联网上的主机上运行图形网络浏览器,并将显示器引导回我雇主防火墙内的笔记本电脑,绕过防火墙内容过滤限制——当然,这是出于完全合法的工作原因。在这种情况下,所有的web请求都来自我的服务器,结果显示在我的笔记本电脑上。你可以使用任何X程序做同样的事情。

如果你以前从未使用过X,它看起来可能有点奇怪,没关系,多用用就会明白它的用处。

Vanilla X通过网络传输未加密的信息。通过X11转发用SSH包装X,保护传输中的X。

X 安全

X非常古老,设计之初的安全性考虑可能不足够强悍。从远程计算机显示X需要将信任扩展到远程计算机。你越信任远程计算机,就可以在本地显示越多的X程序。但如果远程计算机被入侵,入侵者可以使用X接管你的工作站、捕获你的按键,并像你一样访问你的系统。

只允许X转发给真正需要它的用户或主机。

X 和网络

在X开发的时候,一个网站的互联网连接速度可能高达56kbs。试图在站点之间使用X转发是系统管理员在喝啤酒时会嘲笑的事情。不过,现在带宽不再是一个问题,人们可能会在一个大陆上运行浏览器,并在另一个大陆显示它。

虽然带宽在世界许多地方不再是问题,但延迟是非常真实的。许多图形程序对延迟高度敏感。一个程序可能合理地期望每秒执行几百次图形操作。当每个都需要纳秒时,这很好。然而,由于跨国链接,每次需要50毫秒,你的程序就无法使用了。如果延迟不是问题,抖动和数据包丢失会破坏可用性。

如果您有任何延迟,请研究转发X的替代方案。也许动态端口转发(第9章)可以解决您的问题。也许你的程序有一个远程使用的功能,比如Wireshark能够接受来自另一个主机的tcpdump流。使用专为适应高延迟而设计的协议。

不过,在您的本地网络中,X转发可能非常有用。

X 服务器和客户端

X服务器是提供图形显示的计算机。X客户端运行生成显示的程序。

对许多人来说,这似乎是倒退的。

如果你使用的是X,那么X服务器几乎可以肯定是你的桌面。您的桌面必须有X服务器才能使用X转发。

几乎所有类Unix系统都包含一个X服务器,通常来自X.org,但可能是供应商的专有系统。如果您运行的是Windows,则需要第三方X服务器。我们将在PuTTY和X的讨论中涵盖这些内容。

SSH服务器上的X转发

要使用X转发,SSH服务器必须具有xauth程序。如果存在,你可以在sshd_config中使用X11Forwarding关键字启用转发:

然后重启sshd服务。

OpenSSH手册提到了配置X转发细节的其他几个选项,但绝大多数人永远不需要它们中的任何一个。如果你有奇怪的问题,可调查sshd_config手册页中的X11关键字。

OpenSSH客户端中的X转发

OpenSSH客户端支持两个级别的X转发,根据安全级别进行区分,在ssh_config中配置两者。

基本X转发仅支持X协议中不太安全的子集。这种级别的X转发是相当安全的。入侵者无法通过基本的X转发接管你的桌面或窥探你的按键。

始终先尝试这种基本的X转发。

许多X程序使用不太安全的子集之外的函数。当通过SSH转发时,这些程序会显示错误并突然崩溃。启用X转发后,您可以选择允许使用关键字ForwardX11Trusted的全套X函数:

当您允许所有X功能时,您完全信任SSH服务器。控制SSH服务器的入侵者可以捕获您本地屏幕上的所有内容以及您的每一次按键。在全局允许这种信任级别之前,请务必信任您可能登录的每一台远程服务器。一旦你完全确定了,就不要这样做。

X转发是SSH压缩有意义的少数地方之一。将Compression关键字设置为yes以启用压缩。然而,它最好只在每个主机的基础上使用。

每台主机X转发

您可以使用匹配规则配置每台主机的设置,以将X转发限制在仅必要的主机上。这里我在pride上有一个程序,它需要完全信任X,所以我在ssh_config中为它做了一个特殊的条目:

现在我只需要担心一台主机上的X软件,而不是我SSH连接到的每台主机。

在命令行上转发X

比限制X转发到某些主机更好的是在逐个连接的基础上启用它。

在前面的例子中,我完全信任X与主机的所有联系。我在该主机上有一个需要完全X访问权限的程序,但我并不是每次登录该主机时都运行该程序。我只想为某些会话启动X转发。使用-C标志启用压缩。必要时用-X选项激活标准X转发:

如果你必须完全信任远程主机,相当于ForwordX11Trusted,可使用-Y:

这消除了常规转发X的风险,但在必要时支持X准发。

使用PuTTY进行X转发

将X转发到Windows主机的第一个问题是Windows不包括X服务器。你需要额外的软件。幸运的是,许多人已经将标准的X.org软件从UNIX移植到Windows。使用你喜欢的任何一种。我通常使用Xming,但如果你的雇主或同事坚持让你使用不同的Xming,不要担心。

Xming

Xming是Windows系统中广泛使用且经常更新的X服务器。最新版本的Xming仅适用于为该项目捐款的人,但下一个旧版本是免费的。与本书中的所有软件一样,如果你觉得Xming有用,我鼓励你向程序员捐款。Xming为Windows带来了UNIX用户熟悉的各种X技巧,但就我们的目的而言,我们将仅使用它来显示在远程计算机上运行的程序。

http://sourceforge.net/projects/xming/ 下载Xming。Xming安装程序对任何Windows用户来说都非常简单,所以我不会引导你完成它。采用默认设置。完成安装后,运行Xming启动服务器。

启用和禁用X转发

PuTTY默认转发X。

此外,PuTTY没有对X进行基于安全的过滤;它的转发相当于ssh中的ForwardX11Trusted。因此,我建议默认情况下禁用X转发,然后仅在需要时启用它。

在PuTTY配置屏幕的左侧,选择连接->SSH->X11。第一个复选框是启用X11转发。取消选择,然后保存默认设置。保持其他设置不变,因为它们只在不常见的情况下有用。

转发是否正常工作?

转发X后,你的SSH会话看起来没有任何不同。你可以在需要转发之前证明转发是有效的?

如果SSH已成功协商X转发,它将在shell中设置$DISPLAY变量:

你的shell知道有一个X服务器连接到它。你可以运行你的X程序。如果转发不起作用,则$DISPLAY未定义。检查你的系统日志或SSH客户端的调试日志。

使用不安全的传统协议XDMCP的连接$DISPLAY值类似于remote:1。这意味着你的shell在某个地方找到了一个X显示器,但它不是你试图通过SSH转发的显示器。

如果$DISPLAY看起来很奇怪,不要运行你的X程序!有些事情可能非常非常错误。

现在从你的shell运行一个X程序,它应该会显示在你的桌面上。大多数X客户端都包含一个xterm终端仿真器。

在SSH服务器的后台运行xterm:

你将在SSH服务器上收到一个命令提示符。一两分钟后,根据服务器和客户端之间的宽带和延迟,远程系统上的终端将会出现在你的桌面上。

如果你不喜欢xterm,可以试试xclock、xeyes或xcalc。

当你连接时启用了X转发,你可能会看到类似untrusted X11 forwarding set up failed 或 No xauth data 等警告。在通过SSH转发X时,这些警告并不重要,你不应该担心。

使用OpenSSH的远程X命令

登录另一台机器只是为了运行X程序或任何程序,这可能会很烦人。

ssh的-f选项允许你在另一台机器上运行命令,同时保持ssh会话本身的后台。

这看起来像是你直接在另一台主机上执行命令。在要访问的主机后立即发出命令。

例如,我想在主机wrath上运行一个xterm,我可以运行:

客户端将连接到服务器,并显示服务器显示的任何登录文本。然后,SSH客户端进入后台,即使在远程系统上运行命令,也会在本地系统上恢复命令提示符。

注意,远程命令是在用户的完全登录环境中运行的。附加到用户的shell的任何文件,如.cshrc和.profile,都是源文件。这可能会给你带来麻烦,具体却决于你运行的应用程序。

后台转发的X-over-SSH会话非常有用,但通过SSH转发TCP端口更有用。