顯示image問題 - Linux

By Tracy
at 2014-10-21T00:58
at 2014-10-21T00:58
Table of Contents
※ 引述《zchien (小建)》之銘言:
: 公司的一個server,是灌unix程式
: 我寫了一個script,當觸發時,會pop出某個圖片
: 我發現一個現象,如果在server端的桌面 直接執行script => 可以正常顯示
: 但是透過telnet到server執行script, 會顯示can not display.....
所以你是呼叫了一個 X 的程式,所以在本機執行時候不會有問題。
: 我猜想,應該是因為telnet上面,無法顯示圖片的關係
: 但是我的目的是希望 telnet到server執行script時,
: 可以在server桌面 顯示出某個圖片
這邊可能要先說明一下,X Window 本身 Protocol 是有網路支援的,也就是網路
透通的傳輸概念。X client 相關程式執行時候會去找 DISPLAY 這個變數,這是
告知 X Server 的位置,後續 X client 就可以透過該變數引導的位置與 X Server
進行溝通。一般本機環境通常 DISPLAY 變數內容可能為 ":0"。該變數格式:
<host>:<display>[.<screen>]
本機環境大多 host 省略所以只有 :0 這樣格式,啟動的 display 第一個 通常
也都是 0。
那你的問題點很簡單,你用 telnet 登入時候基本上登入之後環境變數內不會帶有
DISPLAY 這個變數,因為 DISPLAY 是存在於你本機使用 startx or gdm 等這類程式
啟動之後帶入的,環境變數持續繼承所以都可以看到該變數項目,所以 X 相關程式
都可以看到該變數所以很正常執行。telnet 遠端登入並不會有該變數,所以基本上
是看不到,所以執行 X 程式只會出現 can't open display 這類訊息。
若你要登入之後能夠在遠端執行 x 程式軟體,然後畫面顯示於那台遠端的主機
server 的話,那還是可以的。比方你的遠端 server 已經啟動 X Window,目前
X 有登入某個帳號,比方是 peter 帳號好了,那你在其他主機遠端也用 peter 帳號
登入該主機,那就:
export DISPLAY=":0"
gedit
就是指定 DISPLAY 變數為本機那個 X Server,那後續就可以執行 gedit 等命令
啟動文書編輯程式。其中 export 是 bash shell 內建命令,若你用其他 shell 請
適當改改,像是tcsh 應該是 setenv DISPLAY ":0" 這類語法。
再來若你 X server 那邊本身登入帳號是 mary,但是你遠端登入是 peter 帳號,
上面方式會被拒絕,一般大多會顯示 Client reject 錯誤訊息,因為帳號沒有一致所以
不能這樣做.. 這是安全性考量,因為允許任何人遠端登入到該主機就可以跑 X 程式顯示
於不是自己帳號的X Window 內不合理。若有這個需求,mary 可以在 X Window 那
server 上開個終端機執行 xhost + 這個命令,表示接受任何連線來源可以存取該 X server,
那就不會被拒絕了。
: 測試過寫在crontab,也不行
cron 乃是背景服務程式,也是沒有該環境變數帶入的,問題同上。
: 不知道是否有其他方法
: 另外想再請教一個指令, 我寫另外一個script,
: 會使用say這個指令,在server桌面,顯示我要說的話
: 我將這say指令的script放在crontab執行時,無法在server桌面,顯示我要說的話
: 但是在server端執行,或是telnet到server執行都可以
: 不知道是否有人知道原因
--
: 公司的一個server,是灌unix程式
: 我寫了一個script,當觸發時,會pop出某個圖片
: 我發現一個現象,如果在server端的桌面 直接執行script => 可以正常顯示
: 但是透過telnet到server執行script, 會顯示can not display.....
所以你是呼叫了一個 X 的程式,所以在本機執行時候不會有問題。
: 我猜想,應該是因為telnet上面,無法顯示圖片的關係
: 但是我的目的是希望 telnet到server執行script時,
: 可以在server桌面 顯示出某個圖片
這邊可能要先說明一下,X Window 本身 Protocol 是有網路支援的,也就是網路
透通的傳輸概念。X client 相關程式執行時候會去找 DISPLAY 這個變數,這是
告知 X Server 的位置,後續 X client 就可以透過該變數引導的位置與 X Server
進行溝通。一般本機環境通常 DISPLAY 變數內容可能為 ":0"。該變數格式:
<host>:<display>[.<screen>]
本機環境大多 host 省略所以只有 :0 這樣格式,啟動的 display 第一個 通常
也都是 0。
那你的問題點很簡單,你用 telnet 登入時候基本上登入之後環境變數內不會帶有
DISPLAY 這個變數,因為 DISPLAY 是存在於你本機使用 startx or gdm 等這類程式
啟動之後帶入的,環境變數持續繼承所以都可以看到該變數項目,所以 X 相關程式
都可以看到該變數所以很正常執行。telnet 遠端登入並不會有該變數,所以基本上
是看不到,所以執行 X 程式只會出現 can't open display 這類訊息。
若你要登入之後能夠在遠端執行 x 程式軟體,然後畫面顯示於那台遠端的主機
server 的話,那還是可以的。比方你的遠端 server 已經啟動 X Window,目前
X 有登入某個帳號,比方是 peter 帳號好了,那你在其他主機遠端也用 peter 帳號
登入該主機,那就:
export DISPLAY=":0"
gedit
就是指定 DISPLAY 變數為本機那個 X Server,那後續就可以執行 gedit 等命令
啟動文書編輯程式。其中 export 是 bash shell 內建命令,若你用其他 shell 請
適當改改,像是tcsh 應該是 setenv DISPLAY ":0" 這類語法。
再來若你 X server 那邊本身登入帳號是 mary,但是你遠端登入是 peter 帳號,
上面方式會被拒絕,一般大多會顯示 Client reject 錯誤訊息,因為帳號沒有一致所以
不能這樣做.. 這是安全性考量,因為允許任何人遠端登入到該主機就可以跑 X 程式顯示
於不是自己帳號的X Window 內不合理。若有這個需求,mary 可以在 X Window 那
server 上開個終端機執行 xhost + 這個命令,表示接受任何連線來源可以存取該 X server,
那就不會被拒絕了。
: 測試過寫在crontab,也不行
cron 乃是背景服務程式,也是沒有該環境變數帶入的,問題同上。
: 不知道是否有其他方法
: 另外想再請教一個指令, 我寫另外一個script,
: 會使用say這個指令,在server桌面,顯示我要說的話
: 我將這say指令的script放在crontab執行時,無法在server桌面,顯示我要說的話
: 但是在server端執行,或是telnet到server執行都可以
: 不知道是否有人知道原因
--
Tags:
Linux
All Comments

By Belly
at 2014-10-21T07:24
at 2014-10-21T07:24

By Jacky
at 2014-10-24T19:50
at 2014-10-24T19:50

By Candice
at 2014-10-28T10:49
at 2014-10-28T10:49

By Belly
at 2014-11-01T20:17
at 2014-11-01T20:17

By Skylar Davis
at 2014-11-03T01:35
at 2014-11-03T01:35
Related Posts
怎麼連VM(CentOS7)內的 Oracle?

By Kama
at 2014-10-20T13:04
at 2014-10-20T13:04
HackingThursday 固定聚會 (2014-10-23)

By Anonymous
at 2014-10-20T12:11
at 2014-10-20T12:11
EmbeddedLinux核心

By Agatha
at 2014-10-20T04:04
at 2014-10-20T04:04
ubuntu ssh root登入

By Brianna
at 2014-10-19T22:35
at 2014-10-19T22:35
雙系統WIN8 CENTOS7無開機選單

By Emily
at 2014-10-18T23:34
at 2014-10-18T23:34