第7章 使用X的网路设备
X的网路特点在於让你可以在网路上的任何机器执行应用程式,而将其输出显示在你自己机器的显示器上,这是X最重要的功能之一,但却很容易使用。
以下将描述你如何指定一个远方终端机,如何实际使用这些功能,最後,我们再描述如何在网路上从其它的机器上控制或限制存取你的显示器。
7.1 指定一个远方终端机 -- -display 选项
几乎所有的X程式都接受以一个命令列的选项来指定使用哪一个显示器 (换个说法,连接到哪一个X server ),这个选项的格式为:
-display displayname
让我们更进一步讨论显示器名称(displayname)的格式。
你会告诉程式它的输出是哪一个显示器 (网路上任何你可以选择的显示器)。明显地,网路上指定机器的名称一定包含在内,但不止於此,因为一些 (大型)机器可以有好几个I/O 工作站,每一个工作站又拥有自己的键盘,滑鼠等等;尤有进者,一个工作站还可能控制了好几部终端机。综上所述,显示器名称需要包含三个元素,hostname,display number和screen number ,我们将详细解释并举例说明。
7.1.1 Hostname
hostname是在网路上与显示器直接连接的机器名称,hostname也决定了应用程式和server是如何连接的。简单地说:
假使Server在你自己本地的机器上执行,你有两种选择:
1. 省略掉hostname,系统会选择最有效率的方式和server交谈。
2. 定hostname为"unix",系统将用Unix domain sockets 作通信。("Unix domain" 意指socket用传统Unix档案名称 (例如/dev/urgent)来命名. )
在命名之後需加一个冒号(:), 即使你省略hostname,你仍需要加冒号。
假使Server在远方的机器上执行,你一样有两种选择,依你网路上用的通信系统而定:
1. TCP/IP :大多数的Unix系统使用此种通信方式, 简单的方法是用在你区域网路上已知的normal name (例如"venus" 或"saturn ")。你也可以用 full Internet name (例如"expo.lcs.mit.edu"或它的Internet address "129.89.12.73")。在 name 後,需要加一个冒号。
2. DECnet :用你连接到的机器上的DECnet nodename,在hostname加两个冒号(::).
7.1.2 display number
显示器是一组监视器,萤幕,连接一个键盘和滑鼠的逻辑萤幕的组合。换句话说,即是使用者工作的地方,在一个给定的CPU 上,显示器从 0开始编号,display number即是指哪个编号的显示器被使用,即使display number为 0,也不可省略。
7.1.3 screen number
对於连接到显示器上数个萤幕也被从 0开始编号,screen number 为你使用萤幕的编号,和display number以一个句点 (.)隔开,screen number 为 0 时可省略,若省略时,其前面的句点一并省略。
7.1.4 范例
以下为一些显示器格式的范例:
. 假设为本地的机器,预设萤幕为 0,以下二者均可:
unix:0
:0
. 假设你指定你自己的机器 (通常是venus),但你需要检验TCP/IP网路的操作和明显地指定萤幕:
venus:0.0
. TCP/IP网路上,远方的机器名为pluto ,仅有一个显示器,指定screen number为 0:
pluto:0.1
. DECnet网路上,display number为 1,预设screen number 为 0:
vomvx2::1
7.2 实际上使用远方的显示器
我们已知如何指定远方的显示器,现在来练习一下:假设你是在venus 工作,想要在saturn上执行一个例如是xterm 的应用程式。你必须在saturn执行xterm 且指定venus 的显示器,则命令如下:(为了清楚起见,本节中我们的命令列包含了命令列前shell 对机器名称的提示)
venus% xterm -display venus:0.0 (注意:不完整!)
以上的指令是在本地的机器启动xterm ,并非在远方的机器启动,不符合需求。
如果在你的作业系统上,并未支持远方机器的操作,你可以藉著连接到saturn的终端机输入下面的命令:
saturn% xterm -display venus:0.0 (注意:不完整!)
则xterm 会在saturn启动,在venus 上建立视窗,视窗会向venus 的滑鼠和键盘取得输入,这的确是你想要的,现在你可以回到venus 机器开始工作。
但由於你的作业系统事实上支援远方机器的功能,所以你毋需离开你的机器便可完成上述的指定,命令如下:
venus% rsh saturn xterm -display venus:0.0
以上是利用普通的远方 shell的设备程式 -- rsh。
注意 1:命令可能因saturn不被允许存取venus 的显示器而失败,欲克服此种状况,输入命令:
venus% xhost +
後再试一次。(xhost命令下一节会解释)
注意 2:你可能需要非同步地执行rsh ,在命令列之後加 &,以背景工作方式执行, 但可能因为等待永远不会有的输入,shell 和rsh 间的交谈导致 rsh "block",为了克服此种情况,需修正命令为:
venus% rsh saturn xterm
-display venus:0.0 < /dev/null &
远方的机器 (这个例子是saturn) 并不需要有X server 在执行,甚至不需要有位元映像显示器,唯一的需求是能执行应用程式和支援网路通讯。
现在总结你的工作模式为:在远方的机器上执行应用程式,连接回自己机
器上的显示器,其架构图见图7 - 1。
┌————————————————┐
│ │
│ P81 FIG 7.1 (???) │
│ │
│ │
│图7 - 1 远方的 client显示器对 │
│ 本地 server架构图 │
└————————————————┘
7.2.1 一个易发生的错误
如果你搞混了而一开始下了这样的命令:
venus% xterm -display saturn:0.0 (不正确)
什麽事会发生?假如这命令被接受,xterm 在你本地的机器上执行,而在远方的机器saturn上建立视窗,你在你的萤幕上只能看到shell 读到的命令列,其它什麽也没有,系统是正确的工作,但不是你想要的。
如果你很幸运,你可能因不被允许或saturn上并没有server在执行,以致无法和saturn上的server连接上,xterm 会传回一个类似下列的讯息而结束:
X Toolkit Error: Can't open display.
如此你就知道有错了。
7.2.2 设定预设显示器
如果你不明确地指定显示器名称,程式会以Unix环境变数DISPLAY 来决定使用哪一个显示器,在启动xterm 时,系统会设定这个变数的内容,所以大部份情况下,你什麽都不必担心。
如果你remote-login其它的机器,在其间你执行X的应用程式,并希望回到你自己的机器上显示,那你必需明确地设定DISPLAY 变数,类似下面:
venus% rlogin saturn
Last login: Mon Nov 28 20:01:02 on console
... (在远方机器上的login banner)
saturn% (远方机器上的shell 提示)
saturn% setenv DISPLAY venus:0.0
saturn% xcalc &
换句话说,如果不设定DISPLAY 变数,则在saturn上执行的每一个X程式都必须包含 -display venus:0.0 选项。
7.3 控制存取你的显示器 -- xhost
我们前面提到过有时你无法连接到特定的显示器,通常的原因是你没有被许可,所以X否认你的存取。
X用很简单的结构控制存取:你指定一份可以存取你的显示器的主机(host)名单,在这些主机上执行的应用程式均可存取你的显示器,其它不在名单上的主机则不被允许。你可以用xhost 程式来控制存取:
允许一或多个机器存取:
xhost + host1 [+host2...]
去掉允许一或多个机器存取:
xhost - host1 [-host2...]
所有的机器均被允许存取:
xhost +
换言之,所有的存取控制均被解除。
恢复存取控制:(通常因为曾经下了xhost + 的命令)
xhost -
再度取得对存取的控制,只有先前明确地被允许的机器可供存取。
注意:存取控制应用於所有的处理 (process),而不只是针对其他使用者所启动的处理,所以如果你透过远方的机器执行应用程式,而将显示内容传回自己的机器,则你必需被授与存取权,否则会连接失败。
7.4 总结
本章中,我们讨论了如何指定X程式的显示器,如何实际在网路上应用,如何允许或禁止网路使用你的显示器。
现在,你已经会使用网路,并且知道有一个视窗管理器会控制你的显示器;我们转而讨论xterm ,并看一看它所提供应用程式介面的细节。