Linux下DISPLAY環境變數之作用---轉

asword發表於2010-02-27
Linux/Unix類操作系統上, 用來設定將圖形顯示到何處. 直接登陸圖形介面或者登陸命令列介面後使用startx啟動圖形, DISPLAY環境變數將自動設定為:0:0, 此時可以開啟終端, 輸出圖形程式的名稱(比如xclock)來啟動程式, 圖形將顯示在本地視窗上, 在終端上輸入printenv檢視當前環境變數, 輸出結果中有如下內容:. g4 Q$ G% @8 W; H& K$ f
8 [: [1 N% U8 s( i% C! x" p
DISPLAY=:0.0' Y9 [# Y4 X% b# d& A$ @
, L$ E% i0 M6 o0 }# o4 I; }
使用xdpyinfo可以檢視到當前顯示的更詳細的資訊.1 `. ^8 X5 u# K3 [@more@]

I W L' {8 c% @

DISPLAY 環境變數格式如下host:NumA.NumB, host指Xserver所在的主機主機名或者ip地址, 圖形將顯示在這一機器上, 可以是啟動了圖形介面的Linux/Unix機器, 也可以是了Exceed, X-Deep/32等Windows平臺執行的Xserver的Windows機器. 如果Host為空, 則表示Xserver執行於本機, 並且圖形程式(Xclient)使用unix socket方式連線到Xserver, 而不是TCP方式. 使用TCP方式連線時, NumA為連線的埠減去6000的值, 如果NumA為0, 則表示連線到6000埠; 使用unix socket方式連線時則表示連線的unix socket的路徑, 如果為0, 則表示連線到/tmp/.X11-unix/X0 . NumB則幾乎總是0.) c* a7 l# E3 F+ l
. i% T3 A1 e$ G.
如果使用su username或者su - username切換到別的使用者, 並且使用命令% g& c4 E8 l" U# r* d
8 w0 a7 B6 f4 M4 h' q
export DISPLAY=:0.0+ Z1 S8 N, b! L9 A9 ~1 N+ Q& t k: Z
. b3 E5 ^- `, h( V& u; K
設定DISPLAY環境變數, 執行圖形程式(如xclock)時會收到如下錯誤:
/ j9 Z* a, L0 t4 h" j }( w8 w
Xlib: connection to ":0.0" refused by
Xlib: No protocol specified
E5 E* b; X4 ]/ d8 ~
Error: Can't open display: :0.0
f* A: F% z; |& {+ C C! { D
這是因為Xserver預設情況下不允許別的使用者的圖形程式的圖形顯示在當前螢幕上. 如果需要別的使用者的圖形顯示在當前螢幕上, 則應以當前登陸的使用者, 也就是切換身份前的使用者執行如下命令$ D9 d, p8 B _# Y! j [

xhost +

這個命令將允許別的使用者啟動的圖形程式將圖形顯示在當前螢幕上.+ b; w6 C j. B' H! ?

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

X11Forwarding no

客戶端配置檔案/etc/ssh/ssh_config包含. Y* q( `- W9 W! M2 n: p
O) z8 e* D" B* K9 l$ z. 5 h. q
ForwardX11 yes e; W5 m. `' B9 b& v+ r& _

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

DISPLAY=localhost:10.0. n5 K: ?/ l1 L* P+ ^" P c z; B
# [. s* r0 e. G6 K% E* Y
在客戶機上用netstat -lnp可以看到有程式監聽了6010埠$ A& x. I9 ?$ h7 O, M m, h

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檔案, 將' l* N9 t6 G8 G! e2 b

exec /usr/bin/X11/X -dpi 100 -nolisten tcp

修改為$ ^0 Y' I1 b! V: B. w9 V

exec /usr/bin/X11/X -dpi 100
A8 ], x4 K K3 z
允許在直接使用startx啟動圖形時啟動對TCP埠的監聽.; x/ N0 @1 M: E! q
! i$ _, _2 e4 w0 j+ `0 f, ~: C. k
修改/etc/kde3/kdm/kdmrc, 將! 1 @$ X& U4 _0 W( f, d! _; i

ServerArgsLocal=-nolisten tcp

修改為
ServerArgsLocal=
+ n9 s; d, ]! M
允許kdm作為顯示器時, 啟動會話時監聽相應的TCP埠.( I' _$ g$ U7 H3 D

修改/etc/gdm/gdm.conf, 在[Security]一節增加, X* I* w' f( Y D3 C

DisallowTCP=false
2 r4 D
或者在登陸視窗選擇"Options" -> "Configure Login Manager..."的Security頁面, 取消"Deny TCP connections to Xserver", 允許gdm作為顯示管理器時, 啟動會話時監聽相應的TCP埠.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/82387/viewspace-1031501/,如需轉載,請註明出處,否則將追究法律責任。

相關文章