xhost 是用来控制X server访问权限的。
通常当你从hostA登陆到hostB上运行hostB上的应用程序时,
做为应用程序来说,hostA是client,但是作为图形来说,
是在hostA上显示的,需要使用hostA的Xserver,所以hostA是
server.因此在登陆到hostB前,需要在hostA上运行xhost +
来使其它用户能够访问hostA的Xserver.
xhost + 是使所有用户都能访问Xserver.
xhost + ip使ip上的用户能够访问Xserver.
xhost + nis:user@domain使domain上的nis用户user能够访问
xhost + inet:user@domain使domain上的inet用户能够访问。
X 安全
在各种环境中,X Windows深受用户们的欢迎。它的客户/服务器模型使得用户能够灵活、强有力的和计算机之间进行交互。然而,它功能强大的同时是以牺牲它的安全性来获取的。如果不能够正确管理X Windows,将会出现一系列弱点。这篇文章正是揭示这些安全问题以及解决方法的。
X Windows如何工作
一个图形用户界面竟是一个潜在而严重的安全缺陷,这一点让人感到迷惑。所以对于新手,让我们来看看X Windows是如何工作的,以及它如何又产生问题。
X Windows使用了一个底层叫做X协议的协议。这个协议既能够用在单个的计算机上,又能够用在计算机网络上。它没有被捆绑在操作系统里而是能够用在多个平台上。X Windows利用网络通信的客户/服务器模式。这个模式能够使用户在一个地方运行程序,而又在其它地方控制这个程序。
与平常的客户/服务器形式相反,用户实际上直接在X Server上工作,X Server提供屏幕、键盘以及鼠标。之所以叫做Server是因为它为客户端产生输入,并管理向客户端输出。X 客户端是一些应用程序,比如xterm,emacs,xclock等等。他们接收和处理输入并输出。
在大多数情况,服务器和客户端运行在同一台机器上。但是X协议是十分具有扩展性的,它有许多培植文件。实际上,X终端是一个屏幕,键盘和鼠标没有计算能力。即使X server运行在一台主机上,客户端也可以运行在其他主机上,即使那台主机在其他建筑或国家里。
那么,如何处理计算机安全问题?可以连接到X server的客户端应该被仔细控制。因为可以多个客户端能够连接到一个X server上,因此要保证这些客户端的行为能够被正确处理。如果一个客户能够向另一个客户发送信息或者截获发往另一个客户的信息,那么这个系统就是有缺陷的。
未设防的X Windows
一些X server与X client通讯的的例子包括下列:
X终端改变----字体管理、鼠标灵敏度、颜色和键盘映射。
X事件 ----包括键盘和鼠标等。
X数据 ---- 影响到X终端的改变,包括输出文本、建立窗口、在屏幕上画图等。
任何连接到X Server的客户程序都能够潜在的改变X的通讯。这可能包括下列:
改变会话参数。
建立/销毁窗口----你在窗口莫名其妙的消失之前是否保存好了费力写的文档?
捕捉X事件----比如在一个xterm窗口读取键盘敲击信息,这很可能就会把他人的帐号与密码得到。
产生X事件 ----比如说发送一些键盘敲击序列到EMACS窗口。
明显的,X servers有与生具来的危险性。更坏的是:许多X server在缺省时允许来自任何地方的主机连向它。
走进安全
什么是处理X server安全问题最好的办法?有两种可以着手的方法:主机认证和标志认证。
下面一一列出。
主机认证
主机认证是用IP地址来标志允许或禁止一个客户端。一旦有一个用户登录到X server上,一个叫做xhost的程序用来控制来自那个IP的客户允许连接。但是大多数主机支持多个一台客户机上用户,所以不可能控制在某一台客户机,允许他上而别人不行。
标志认证
第二种方法是校验每个客户机所提供的标志。这个工作由一个叫做"xauth"的程序来完成:每一个客户都被给予一个叫做"magic cookie"的东西,它必须向X server提供一个随机值来获得进入权利。
The second form. of authentication is to verify each client based on the token they offer. Using a program called xauth, each client is given a "magic cookie," a random value which it must offer to the X Server to be allowed access.
主机认证
当然了,X安全用的最广的机制就是"xhost"程序。虽然用起来很简单,但是很不灵活。
使用xhost
xhost使用起来很简单。每一个X Server维护着一个主机列表,里面写着那台主机可以进入,那台不可以。xhost程序用来改变这个列表,命令行语法如下:
显示允许连接X Server的主机列表:
xhost
增加一个主机:
xhost +bar.foo.org
于是, 任何在bar.foo.org上的用户或程序都能够与X server通讯。
删除一个主机:
xhost -bar.foo.org
使X server向全世界开放:
xhost +
访问控制被再次允许:
xhost -
利用xhost,我们可以给某一个客户机在与X server连接的短暂时间内的权限打开,当客户机连上之后再取消这个权限,这样,虽然这个权限被取消掉了,但此时的通讯还能够进行。
优点:
xhost访问控制机制的确十分容易使用,它只需要简单的参数即可。
缺点:
xhost的简单既带来好处又带来坏处:从一个客户机所来的用户要么全部允许,要么全部拒绝,而不能更细的分类----你能他不能。在许多环境里,可能有大量的用户在使用同一台客户机,因此这种机制就不能够胜任。
遗憾的是,许多X server,象NCD Servers,SGI system 以及Macintosh X,他们的X server的访问权限在缺省下是关闭的,对于不熟悉X server缺点的用户,用主机认证机制会带来安全问题。
Xhost比标志认证有更高的优先级。任何用户可以在把自己的机器加入到xhost的访问列表中而不顾自己的权限。
标志认证
X server可以通过利用"magic cookie"来控制用户级的对X server的访问。这是一个机器可以识别的、随机产生的代码。一个X client必须在被X server允许访问之前向X server提供相同的"magic cookie"值。这个值被存在文件".Xauthority"中,它既可以在每次会话的开始对于只是想登陆到一台机器上的用户来说,这个增强的安全机制是透明的。每一个由特定用户启动的客户端能够发现这个"magic cookie"并且用此来访问X server。但是, 许多用户工作在许多个机器上,那么,一个在远程机器上的X client如何知道这个"magic cookie"呢?
下来就要介绍xauth这个程序的功能了。
xauth
xauth程序用来编辑和显示用户的"magic cookie"认证信息。一旦"magic cookie"显示成可度的形式,它就可以被送到远程主机上。在远程主机上,xauth被再次用来引入这些"magic cookie"到".Xauthority"文件中。假设远程主机用户目录下的".rhost"文件已经为本用户的rsh的使用准备好了,我们用下面的命令:
xauth extract - $DISPLAY | rsh ahost.foo.org xauth merge -
第一条命令打印所处的机器里"magic cookie"值到标准输出。这些信息被通过管道用rsh命令调用xauth引入到ahost.foo.org。于是能够在ahost.foo.org这个机器上运行X client。重要的是要将".Xauthority"文件的权限设置正确。
X Display Manager
xdm是一个客户端程序,能够提供登录画面并能够同时连接多个X Server。当一个用户进行这种登陆时,xdm将一个"magic cookie"值写到用户自己目录下的".Xauthority"文件里。X server并不常常仅仅充当独立的一个角色,它们同时也可担任X终端的角色,此时它须运行xdm来提供初始的登陆画面。xdm提供对"magic cookie"值的认证,这个认证必须首先通过配置 "/usr/lib/X11/xdm/xdm/xdm-config"文件的这一条打开。
DisplayManager*authorize:true
用这个,xdm每次在用户登录时产生一个新的"magic cookie"值,并且把它保存在这些用户的".Xauthority"文件中。
如果不用xdm,仍然可以用这种认证机制,下面就要谈到:
非利用xdm产生一个"magic cookie"值
Xdm用来管理".Xauthority"文件,但是如果不用xdm,仍然可以用"magic cookie"认证机制。
唯一的问题是:在许多X11 Server上,用户需要产生一个"magic cookie"值(OpenWindows是一个例外:这个值在启动时自动产生)。这工作可以通过各种方法来完成。例如,如果有Korn shell,它里面内建有一个随机数产生器:
randomkey=`ksh -c echo $(( $RANDOM * $RANDOM * 2 ))`
xauth add ${HOST}:0.$randomkey
还有,用时间可以产生一个随机值:
randomkey=`date +"%y%m%d%H%M%S"`
xauth add ${HOST}:0 . $randomkey
Xrsh in X11R5
Xrsh是一个X11R5提供的脚本,它存在于"contrib/clients/xrsh"目录下,对于任何想要经过rsh在远程运行客户程序的用户来说,这是一个十分顺手的脚本,它利用xauth自动拷贝cookie code到远程的机器上,例如,运行在foo主机上的xterm程序,键入:
xrsh -auth xauth foo xterm
好处:
现在可以按照用户方式进行认证了。在一个主机有多人用的情况下,用这种方式进行认证很有必要。
缺点:
xdm和xauth程序对于用户和管理员来说,运行和维护起来很费时。需要在用户观点对X客户/服务器模式有深的了解。
Xterm的缺陷
xterm用来提供给用户一个命令提示符。因为频繁涉及到人与机器之间的交互,因此,它的安全性也很重要。xterm有几个弱点值得提防。
xterm有一个写访问的特性不应该被利用:SendEvents是人工产生的鼠标和键盘的事件。缺省时,xterm拒绝所有来自X server的关于SendEvent事件的请求。但这个开关可以进行设置,第一种方法是在".Xdefaults"或"app-defaults/Xterm"中增加一条X资源定义:
xterm*allowSendEvents: True
通常当你从hostA登陆到hostB上运行hostB上的应用程序时,
做为应用程序来说,hostA是client,但是作为图形来说,
是在hostA上显示的,需要使用hostA的Xserver,所以hostA是
server.因此在登陆到hostB前,需要在hostA上运行xhost +
来使其它用户能够访问hostA的Xserver.
xhost + 是使所有用户都能访问Xserver.
xhost + ip使ip上的用户能够访问Xserver.
xhost + nis:user@domain使domain上的nis用户user能够访问
xhost + inet:user@domain使domain上的inet用户能够访问。
在各种环境中,X Windows深受用户们的欢迎。它的客户/服务器模型使得用户能够灵活、强有力的和计算机之间进行交互。然而,它功能强大的同时是以牺牲它的安全性来获取的。如果不能够正确管理X Windows,将会出现一系列弱点。这篇文章正是揭示这些安全问题以及解决方法的。
X Windows如何工作
一个图形用户界面竟是一个潜在而严重的安全缺陷,这一点让人感到迷惑。所以对于新手,让我们来看看X Windows是如何工作的,以及它如何又产生问题。
X Windows使用了一个底层叫做X协议的协议。这个协议既能够用在单个的计算机上,又能够用在计算机网络上。它没有被捆绑在操作系统里而是能够用在多个平台上。X Windows利用网络通信的客户/服务器模式。这个模式能够使用户在一个地方运行程序,而又在其它地方控制这个程序。
与平常的客户/服务器形式相反,用户实际上直接在X Server上工作,X Server提供屏幕、键盘以及鼠标。之所以叫做Server是因为它为客户端产生输入,并管理向客户端输出。X 客户端是一些应用程序,比如xterm,emacs,xclock等等。他们接收和处理输入并输出。
在大多数情况,服务器和客户端运行在同一台机器上。但是X协议是十分具有扩展性的,它有许多培植文件。实际上,X终端是一个屏幕,键盘和鼠标没有计算能力。即使X server运行在一台主机上,客户端也可以运行在其他主机上,即使那台主机在其他建筑或国家里。
那么,如何处理计算机安全问题?可以连接到X server的客户端应该被仔细控制。因为可以多个客户端能够连接到一个X server上,因此要保证这些客户端的行为能够被正确处理。如果一个客户能够向另一个客户发送信息或者截获发往另一个客户的信息,那么这个系统就是有缺陷的。
未设防的X Windows
一些X server与X client通讯的的例子包括下列:
X终端改变----字体管理、鼠标灵敏度、颜色和键盘映射。
X事件 ----包括键盘和鼠标等。
X数据 ---- 影响到X终端的改变,包括输出文本、建立窗口、在屏幕上画图等。
任何连接到X Server的客户程序都能够潜在的改变X的通讯。这可能包括下列:
改变会话参数。
建立/销毁窗口----你在窗口莫名其妙的消失之前是否保存好了费力写的文档?
捕捉X事件----比如在一个xterm窗口读取键盘敲击信息,这很可能就会把他人的帐号与密码得到。
产生X事件 ----比如说发送一些键盘敲击序列到EMACS窗口。
明显的,X servers有与生具来的危险性。更坏的是:许多X server在缺省时允许来自任何地方的主机连向它。
走进安全
什么是处理X server安全问题最好的办法?有两种可以着手的方法:主机认证和标志认证。
下面一一列出。
主机认证
主机认证是用IP地址来标志允许或禁止一个客户端。一旦有一个用户登录到X server上,一个叫做xhost的程序用来控制来自那个IP的客户允许连接。但是大多数主机支持多个一台客户机上用户,所以不可能控制在某一台客户机,允许他上而别人不行。
标志认证
第二种方法是校验每个客户机所提供的标志。这个工作由一个叫做"xauth"的程序来完成:每一个客户都被给予一个叫做"magic cookie"的东西,它必须向X server提供一个随机值来获得进入权利。
The second form. of authentication is to verify each client based on the token they offer. Using a program called xauth, each client is given a "magic cookie," a random value which it must offer to the X Server to be allowed access.
主机认证
当然了,X安全用的最广的机制就是"xhost"程序。虽然用起来很简单,但是很不灵活。
使用xhost
xhost使用起来很简单。每一个X Server维护着一个主机列表,里面写着那台主机可以进入,那台不可以。xhost程序用来改变这个列表,命令行语法如下:
显示允许连接X Server的主机列表:
xhost
增加一个主机:
xhost +bar.foo.org
于是, 任何在bar.foo.org上的用户或程序都能够与X server通讯。
删除一个主机:
xhost -bar.foo.org
使X server向全世界开放:
xhost +
访问控制被再次允许:
xhost -
利用xhost,我们可以给某一个客户机在与X server连接的短暂时间内的权限打开,当客户机连上之后再取消这个权限,这样,虽然这个权限被取消掉了,但此时的通讯还能够进行。
优点:
xhost访问控制机制的确十分容易使用,它只需要简单的参数即可。
缺点:
xhost的简单既带来好处又带来坏处:从一个客户机所来的用户要么全部允许,要么全部拒绝,而不能更细的分类----你能他不能。在许多环境里,可能有大量的用户在使用同一台客户机,因此这种机制就不能够胜任。
遗憾的是,许多X server,象NCD Servers,SGI system 以及Macintosh X,他们的X server的访问权限在缺省下是关闭的,对于不熟悉X server缺点的用户,用主机认证机制会带来安全问题。
Xhost比标志认证有更高的优先级。任何用户可以在把自己的机器加入到xhost的访问列表中而不顾自己的权限。
标志认证
X server可以通过利用"magic cookie"来控制用户级的对X server的访问。这是一个机器可以识别的、随机产生的代码。一个X client必须在被X server允许访问之前向X server提供相同的"magic cookie"值。这个值被存在文件".Xauthority"中,它既可以在每次会话的开始对于只是想登陆到一台机器上的用户来说,这个增强的安全机制是透明的。每一个由特定用户启动的客户端能够发现这个"magic cookie"并且用此来访问X server。但是, 许多用户工作在许多个机器上,那么,一个在远程机器上的X client如何知道这个"magic cookie"呢?
下来就要介绍xauth这个程序的功能了。
xauth
xauth程序用来编辑和显示用户的"magic cookie"认证信息。一旦"magic cookie"显示成可度的形式,它就可以被送到远程主机上。在远程主机上,xauth被再次用来引入这些"magic cookie"到".Xauthority"文件中。假设远程主机用户目录下的".rhost"文件已经为本用户的rsh的使用准备好了,我们用下面的命令:
xauth extract - $DISPLAY | rsh ahost.foo.org xauth merge -
第一条命令打印所处的机器里"magic cookie"值到标准输出。这些信息被通过管道用rsh命令调用xauth引入到ahost.foo.org。于是能够在ahost.foo.org这个机器上运行X client。重要的是要将".Xauthority"文件的权限设置正确。
X Display Manager
xdm是一个客户端程序,能够提供登录画面并能够同时连接多个X Server。当一个用户进行这种登陆时,xdm将一个"magic cookie"值写到用户自己目录下的".Xauthority"文件里。X server并不常常仅仅充当独立的一个角色,它们同时也可担任X终端的角色,此时它须运行xdm来提供初始的登陆画面。xdm提供对"magic cookie"值的认证,这个认证必须首先通过配置 "/usr/lib/X11/xdm/xdm/xdm-config"文件的这一条打开。
DisplayManager*authorize:true
用这个,xdm每次在用户登录时产生一个新的"magic cookie"值,并且把它保存在这些用户的".Xauthority"文件中。
如果不用xdm,仍然可以用这种认证机制,下面就要谈到:
非利用xdm产生一个"magic cookie"值
Xdm用来管理".Xauthority"文件,但是如果不用xdm,仍然可以用"magic cookie"认证机制。
唯一的问题是:在许多X11 Server上,用户需要产生一个"magic cookie"值(OpenWindows是一个例外:这个值在启动时自动产生)。这工作可以通过各种方法来完成。例如,如果有Korn shell,它里面内建有一个随机数产生器:
randomkey=`ksh -c echo $(( $RANDOM * $RANDOM * 2 ))`
xauth add ${HOST}:0.$randomkey
还有,用时间可以产生一个随机值:
randomkey=`date +"%y%m%d%H%M%S"`
xauth add ${HOST}:0 . $randomkey
Xrsh in X11R5
Xrsh是一个X11R5提供的脚本,它存在于"contrib/clients/xrsh"目录下,对于任何想要经过rsh在远程运行客户程序的用户来说,这是一个十分顺手的脚本,它利用xauth自动拷贝cookie code到远程的机器上,例如,运行在foo主机上的xterm程序,键入:
xrsh -auth xauth foo xterm
好处:
现在可以按照用户方式进行认证了。在一个主机有多人用的情况下,用这种方式进行认证很有必要。
缺点:
xdm和xauth程序对于用户和管理员来说,运行和维护起来很费时。需要在用户观点对X客户/服务器模式有深的了解。
Xterm的缺陷
xterm用来提供给用户一个命令提示符。因为频繁涉及到人与机器之间的交互,因此,它的安全性也很重要。xterm有几个弱点值得提防。
xterm有一个写访问的特性不应该被利用:SendEvents是人工产生的鼠标和键盘的事件。缺省时,xterm拒绝所有来自X server的关于SendEvent事件的请求。但这个开关可以进行设置,第一种方法是在".Xdefaults"或"app-defaults/Xterm"中增加一条X资源定义:
xterm*allowSendEvents: True
第二种方法是允许X Server通过xterm的"Options menu"发送X 事件(通过同时按住CTRL和鼠标左键完成),这两种方法不应该被利用,因为它们打开xterm的"Secure Keyboard"功能来截获其他客户端的输入。
X Window 系统使用指南 -- 第7章 使用X的网路设备
本文出自: 作者:cuteyu 整理 (2001-10-08 07:00:00)
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 ,并看一看它所提供应用程式介面的细节。
http://www.fanqiang.com/
本文出自: 作者:cuteyu 整理 (2001-10-08 07:00:00)
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 ,并看一看它所提供应用程式介面的细节。
http://www.fanqiang.com/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14710393/viewspace-754581/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14710393/viewspace-754581/