Running applications remote with X11

ArticleCategory: [Choose a category, do not translate this]

UNIX Basics

AuthorImage:[Here we need a little image from you]

[Photo of the Author]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Guido Socher

en to zh Xu Gang

AboutTheAuthor:[A small biography about the author]

Guido 喜欢Linux不但因为了解操作系统如何工作是一件有趣的事, 而且也应为沉迷于它的设计的人们

Abstract:[Here you write a little summary]

许多第一次使用Linux的用户认为Linux的图形桌面只是另一个可以在不同的 窗口运行程序的 "Windows"。一些人注意到了自己可以拥有好几个桌面。但是, Linux X Window System (X11)绝不仅仅只是这么简单! 它是一个网络窗口系统(network windows system)。下面我们将看到它能提供哪些新的、强大的功能。

ArticleIllustration:[This is the title picture for your article]

[Illustration]

ArticleBody:[The article body]

Display的概念

每个X Window应用程序在启动的时候都会去读取DISPLAY这个环境变量来 确定要把图像送到哪台计算机的显示器。这个再配合X的网络性能使远程运行 图形化程序成为可能。当你远程操作一个应用程序的时候,你用的是远程那台 计算机的CPU资源。完整的图形化用户界面(GUI:Graphical User Interface)将显示在你本地的 计算机上。
在这里,网络速度当然也是一个需要考虑的因素,不过普通的10Mbit/s连接的局域网就足够了。


[run in an application remote]

为什么你要这么做?
有很多“network graphics”的应用程序。一些公司使用这类程序来远程控制设备, 而这些设备可能远在几千公里之外,你可以用同样的软件来控制它们,就好像你就在 那里一样。
你可能有两台机器,一台高速的1GHz的电脑,另一台133MHz的老奔腾。 你可以尽情的享受新机器,但是不必坐在它前面。也许你的妹妹正坐在那台新电脑前 并登录在上面。但这并不影响你使用你的新电脑的功能
[display] 怎样实现?
所有的X Window应用程序,如:gimp,xterm,konquerer,netscape等等都是 一个网络客户端,它们都连到一个服务器上,这就是:X-server。 X-server的任务就是告诉图形硬件,在你的显示器上绘制图像,读取鼠标和 键盘的输入。客户端(也就是你的应用程序比如:gimp,netscape等等)发送 诸如怎么样绘制框架、按钮等指令给X-server,反过来,客户端从X-server接收 鼠标和键盘的事件。很显然,你需要某种验证,否则任何人都可以弄乱别人的屏幕了。 这里有两个程序来进行控制:
- xhost: 使用这个程序你可以允许给定机器上的任何用户写你的屏幕。 比如:你正坐在一台叫philosophus的机器前,为了允许主机movietux上的任何程序 可以写你的philosophus的屏幕,你可以键入如下命令:

xhost +movietux
必须在philosophus的shell下键入


- xauth: 这是一个基于cookie的可靠的验证方法。这里你可以给单独的人设定权限。 这种方法比xhost安全很多,它使用存储在用户主目录里的文件.Xauthority里的cookie, 如果远程的机器在这个文件里有一个有效的cookie,则同意访问。为了拷贝你面前的 机器(philosophus)的cookie到你想要在运行程序的机器(movietux)里,你可以 使用下列方法中的一种:

xauth extract - philosophus:0.0 | ssh movietux /usr/X11R6/bin/xauth merge
or
scp ~/.Xauthority movietux:


在程序开始运行之前经过了如下的过程:
  1. 客户端检查DISPLAY环境变量来查找另外的服务器,连接到这台主机的X-server上。
  2. 服务器端检查客户端是否被允许发送给自己,如果客户端是经过验证的,则服务端 将开始在屏幕上显示图像。
环境变量DISPLAY的语法:

bash:export DISPLAY=hostname:displaynumber.screennumber
tcsh:setenv DISPLAY hostname:displaynumber.screennumber

在这里不讨论displaynumber和screennumber,它们通常是0:0 这是一个bash下的例子:

export DISPLAY=philosophus:0.0

远程启动一个应用程序

在理论过后,我们来看一个实际的例子。我们重新回到philosophus这台机器前,并且准备 在movietux机器上远程运行一些程序。
  1. 告诉你的X-server允许movietux上的客户端再你的屏幕上显示图像:
    xhost +movietux
  2. 登录到远程主机movietux:
    slogin -l username movietux
  3. 现在你已经登录到movietux上,并且你执行的每条命令都在movietux上执行
  4. export DISPLAY=philosophus:0.0
  5. 运行程序 比如:
    netscape &
如果movietux是一台比较强劲的机器,你会注意到在netscape里显示html的时候会比 在本地的时候快一点。同时,你不会从使用方面注意到这个netscape不是运行在本地的, 因为你同样是用鼠标、键盘进行着和本地一样的操作。
很酷,不是嘛?

Taking the display with you

虽然远程运行一个应用程序是比较简单的,可是这里还需要为设置DISPLAY再动动手,也可以 自动完成: