關於Linux跨網路執行X Window程式

2021-06-04 01:50:11 字數 4849 閱讀 2003

x window在設計上就是跨網路的,x client是需要圖形顯示的應用程式, x server則負責具體顯示和傳遞使用者互動行為。二者之間通訊的協議稱為 x protocol,x協議。

基於主機驗證的x window配置

(1) 在x server端,加入允許傳送x request的機器位址。

$ xhost +192.168.0.1關於xhost的用法示例:

$ xhost -192.168.0.1 #取消192.168.0.1傳送x request到本機$ xhost + #允許所有主機傳送x request到本機$ xhost + #再次執行該命令取消允許所有主機的授權此外,可在/etc/x*.hosts中永久加入某些授權主機,其中*是本機顯示編號,比如x0.hosts。細節可看man xhost的說明。

192.168.0.1192.168.0.2(2) 現在,就可以ssh(可能需要配置ssh**x11資料,我沒嘗試過)或者telnet到x client機器,並執行x window應用程式,而顯示和操作在x server端。

$ xeyes -display 192.168.0.254:0其中192.168.0.254是(1)中配置的主機,後面的:0表示傳送到0號led/' target='_blank'>顯示螢幕。有些x程式不支援-display引數,此時可考慮匯出display環境變數。

$ export display=192.168.0.254:0也許你會問,一台機器可以有多個顯示螢幕嗎?有的,預設啟動的螢幕為0,不過你還可以啟動多個。對於gdm啟動x window的方式,你可以修改/etc/x11/gdm/gdm.conf:

0=/usr/bin/x11/x -bpp 8 vt71=/usr/bin/x11/x -bpp 8 vt9...-bpp.引數指定顏色數,此處為8位色深。vt7表示ctrl+alt+f7可切換到該螢幕,vt9表示ctrl+alt+f9。你可以指定任意數目的顯示螢幕。

如果要配置不同螢幕的登入介面,可執行如下操作:

$ cp /etc/x11/gdm/init/default /etc/x11/gdm/init/:0$ cp /etc/x11/gdm/init/default /etc/x11/gdm/init/:1然後可修改其中的配置命令。

對於startx啟動x window的方式,可直接在命令列指定,比如 startx -- :1。

基於每使用者驗證的x window配置

基本步驟是:先在x server端的使用者目錄生成使用者的cookie,然後把該cookie加入到x client的使用者目錄。這樣x client程式執行的時候,會根據當前的display搜尋cookie資訊,併發送到x server,從而得到驗證。

因此,首先需要在x server端生成cookie,可用xauth命令。

$ xauthusing authority file /home/yingyuan/.xauthorityxauth>list192.168.0.199/unix:0 mit-magic-cookie-1 8432567fa3ae2341xauth>add 192.168.0.199:0 mit-magic-cookie-1 8432567fa3ae2341xauth>list192.168.0.199/unix:0 mit-magic-cookie-1 8432567fa3ae2341192.168.0.199:0 mit-magic-cookie-1 8432567fa3ae2341xauth>exit系統原來就有了乙個cookie,我們用add命令新加了乙個。

那麼,如何把cookie傳遞給x client呢?實現方法有三種,以下分別介紹。

(1) 直接把~/.xauthority從x server複製為x client下的~/.xauthority。這是最簡單的實現辦法。

(2) 用xauth的extract和merge命令。

在x server端,

$ xauth...xauth>extract mycookie 192.168.0.199:0xauth>exit然後我們把mycookie檔案傳到x client,並在x client執行如下命令,

$ xauth...xauth>merge mycookiexauth>exit(3) 記下x server端的cookie值(用xauth的list可檢視),

$ xauth...xauth>list192.168.0.199/unix:0 mit-magic-cookie-1 8432567fa3ae2341192.168.0.199:0 mit-magic-cookie-1 8432567fa3ae2341xauth>exit然後在x client用xauth的add新增到.xauthority檔案。

$ xauth...xauth>add 192.168.0.199:0 mit-magic-cookie-1 8432567fa3ae2341xauth>exitx window為我們執行程式提供了很大的靈活性,不是一般的gui作業系統所能比擬的。microsoft windows可以通過執行x onnet、x-winpro、omni-x等程式提供x server服務,從而可以執行linux上的x client程式。

error: can''t open display!

在linux/unix類作業系統上, display用來設定將圖形顯示到何處. 直接登陸圖形介面或者登陸命令列介面後使用startx啟**形, display環境變數將自動設定為:0:0, 此時可以開啟終端, 輸出圖形程式的名稱(比如xclock)來啟動程式, 圖形將顯示在本地視窗上, 在終端上輸入printenv檢視當前環境變數, 輸出結果中有如下內容:

display=:0.0

使用xdpyinfo可以檢視到當前顯示的更詳細的資訊.

display 環境變數格式如下hostname: displaynumber.screennumber,我們需要知道,在某些機器上,可能有多個顯示裝置共享使用同一套輸入裝置,例如在一台pc上連線兩台crt顯示器,但是它們只共享使用乙個鍵盤和乙個滑鼠。這一組顯示裝置就擁有乙個共同的displaynumber,而這組顯示裝置中的每個單獨的裝置則擁有自己單獨的 screennumber。displaynumber和screennumber都是從零開始的數字。這樣,對於我們普通使用者來說, displaynumber、screennumber就都是0。 hostname指xserver所在的主機主機名或者ip位址, 圖形將顯示在這一機器上, 可以是啟動了圖形介面的linux/unix機器, 也可以是安裝了exceed, x-deep/32等windows平台執行的xserver的windows機器. 如果host為空, 則表示xserver執行於本機, 並且圖形程式(xclient)使用unix socket方式連線到xserver, 而不是tcp方式. 使用tcp方式連線時, displaynumber為連線的埠減去6000的值, 如果displaynumber為0, 則表示連線到6000埠; 使用unix socket方式連線時則表示連線的unix socket的路徑, 如果displaynumber為0, 則表示連線到/tmp/.x11-unix/x0 . screennumber則幾乎總是0.

如果使用su username或者su - username切換到別的使用者, 並且使用命令

export display=:0.0

設定display環境變數, 執行圖形程式(如xclock)時會收到如下錯誤:

xlib: connection to ":0.0" refused by server

xlib: no protocol specified

error: can''t open display: :0.0

這是因為xserver預設情況下不允許別的使用者的圖形程式的圖形顯示在當前螢幕上. 如果需要別的使用者的圖形顯示在當前螢幕上, 則應以當前登陸的使用者, 也就是切換身份前的使用者執行如下命令

xhost +

這個命令將允許別的使用者啟動的圖形程式將圖形顯示在當前螢幕上.

在2臺linux機器之間, 如果設定伺服器端配置檔案/etc/ssh/sshd_config中包含

x11forwarding no

客戶端配置檔案/etc/ssh/ssh_config包含

forwardx11 yes

則從客戶端ssh到伺服器端後會自動設定display環境變數, 允許在伺服器端執行的圖形程式將圖形顯示在客戶端上. 在伺服器上檢視環境變數顯示如下(這個結果不同的時候並不相同)

display=localhost:10.0

在客戶機上用netstat -lnp可以看到有程式*了6010埠

tcp        0      0 127.0.0.1:6010          0.0.0.0:*               listen     4827/1

如 果希望允許遠端機器上的圖形程式將圖形顯示在本地機器的xserver上, 除了要設定遠端機器的display環境變數以外, 還需要設定本地機器的xserver*相應的tcp埠. 而現在的linux系統出於安全的考慮, 預設情況下不再*tcp埠. 可通過修改/etc/x11/xinit/xserverrc檔案, 將

exec /usr/bin/x11/x -dpi 100 -nolisten tcp

修改為exec /usr/bin/x11/x -dpi 100

允許在直接使用startx啟**形時啟動對tcp埠的*.

修改/etc/kde3/kdm/kdmrc, 將

serverargslocal=-nolisten tcp

修改為serverargslocal=

允許kdm作為顯示管理器時, 啟動會話時*相應的tcp埠.

修改/etc/gdm/gdm.conf, 在[security]一節增加

disallowtcp=false

或者在登陸視窗選擇"options" -> "configure login manager..."的security頁面, 取消"deny tcp connections to xserver", 允許gdm作為顯示管理器時, 啟動會話時*相應的tcp埠.

關於Linux網路排錯

無法連線網路的原因無非是硬體問題或者軟體問題。網線 網線被截斷 網線過渡扭曲變形造成訊號不良 網路接頭與裝置接觸不良。網絡卡,hub及router等網路裝置的問題,常見 的問題如下 網絡卡不穩定,質量不佳,或者與整體系統的相容性不好 各網路裝置的接頭質量不佳,接觸不良,造成訊號衰減 由於網路裝置所處...

關於Linux系統的執行級別

執行級別就是作業系統當前正在執行的功能級別。這個級別從0到6 對各個執行級的詳細解釋 0 為停機,機器關閉。1 為單使用者模式,就像win9x下的安全模式類似。2 為多使用者模式,但是沒有nfs支援。3 為完整的多使用者模式,是標準的執行級。4 一般不用,在一些特殊情況下可以用它來做一些事情。例如在...

關於網路執行慢的故障之一

51cto 周一,同事發現公司網路掉包嚴重,公司網路時斷時好,連線速度緩慢,由於周一我公休,我同事把所有交換機路由器全部重新啟動.依然無法解決.詢問同事週日停電後就出現了此故障.初步估計可能由於某個網路裝置出現故障.周二.到公司後,用ethereal協議分析工具發現,arp和ipx分別佔到了整個流量...