第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 ,並看一看它所提供應用程式介面的細節。