एक दूरस्थ एक्स डिस्प्ले पर एक विंडो खोलें (क्यों "ओपन डिस्प्ले नहीं कर सकते")?


81

एक ज़माने में,

DISPLAY=:0.0 totem /path/to/movie.avi

अपने लैपटॉप से ​​अपने डेस्कटॉप में ssh के बाद मेरे डेस्कटॉप movie.aviपर खेलने के लिए टोटम का कारण होगा ।

अब यह त्रुटि देता है:

No protocol specified
Cannot open display:

मैंने डेबियन निचोड़ को पुनः स्थापित किया जब यह दोनों कंप्यूटरों पर स्थिर हो गया, और मुझे लगता है कि मैंने कॉन्फ़िगरेशन को तोड़ दिया।

मैंने इस पर गुगली की है, और मेरे जीवन के लिए यह पता नहीं लगा सकता कि मैं क्या करने वाला हूं।

(VLC में एक HTTP इंटरफ़ेस है जो काम करता है, लेकिन यह ssh जितना सुविधाजनक नहीं है।)

वही समस्या तब होती है जब मैं इसे क्रॉन जॉब से चलाने की कोशिश करता हूं।


1
क्या आपकी दूरस्थ मशीन एक .Xauthority फ़ाइल दिखाती है? दूसरा स्पष्ट प्रश्न है - क्या आपके ssh सर्वर और क्लाइंट को X अग्रेषण की अनुमति देने के लिए कॉन्फ़िगर किया गया है? आपने ssh को किस कमांड का उपयोग किया?
फहीम मीठा

1
क्या मैं एक्स को आगे बढ़ाने की कोशिश कर रहा हूं? मैं चाहता हूं कि कमांड को होस्ट पर निष्पादित किया जाए, न कि क्लाइंट को। मेरा ssh कमांड सिर्फ ssh me @ host find है। होस्ट कंप्यूटर पर .authority किसी भी फाइल से मेल नहीं खाता है।
जस्टिन क्रेस

जैसा कि फहीम सुझाव देते हैं, एक अच्छा बदलाव है कि आपकी समस्या totemआपके एक्स कुकी को नहीं ढूंढने के कारण है , और आपको XAUTHORITYअपने डेस्कटॉप पर अपने नियमित सत्र में उचित मूल्य, यानी मान को सेट करने की आवश्यकता है । लिनक्स पढ़ें : wmctrl तब नहीं खुल सकता जब सत्र किसी पृष्ठभूमि के लिए ssh + स्क्रीन के माध्यम से शुरू किया गया हो ; संबंधित उत्तर भी देखें क्या रूट मैं अन्य उपयोगकर्ताओं के डेस्कटॉप पर एक ग्राफिकल प्रोग्राम लॉन्च कर सकता हूं?
गाइल्स

1
ठीक है, भौतिक रूप से कंप्यूटर पर बैठे और टाइपिंग गूंज $ XAUTHORITY देता है / ssh सत्र में / var / run / gdm3 / schem-for-jcress-bb32gX / डेटाबेस, प्रतिध्वनि $ $ टाइप करना = (ऊपर का रास्ता) समस्या का समाधान नहीं करता है
जस्टिन कैस

1
मैं जीडीएम 3 को दोष देता हूं, वे क्यों नहीं रख सकते $XAUTHORITYथे ~/.Xauthorityजैसे हर कोई इसे होने की उम्मीद करता है।
तीरमास्टर

जवाबों:


78

( लिनक्स से अनुकूलित : sm + स्क्रीन के माध्यम से शुरू होने पर wmctrl प्रदर्शन नहीं खोल सकता है )

प्रदर्शन और स्वचालन

एक्स डिस्प्ले से कनेक्ट करने के लिए एक एक्स प्रोग्राम को दो टुकड़ों की जानकारी चाहिए।

  • इसे डिस्प्ले के पते की आवश्यकता होती है, जो आमतौर पर :0जब आप स्थानीय रूप से लॉग इन करते हैं :10, या :11आदि, जब आप दूरस्थ रूप से लॉग इन होते हैं (लेकिन नंबर कितने एक्स कनेक्शन सक्रिय हैं इसके आधार पर बदल सकते हैं)। प्रदर्शन का पता सामान्य रूप से DISPLAYपर्यावरण चर में इंगित किया गया है।

  • इसमें डिस्प्ले के लिए पासवर्ड की जरूरत होती है। एक्स डिस्प्ले पासवर्ड को मैजिक कुकीज कहा जाता है । मैजिक कुकीज को सीधे निर्दिष्ट नहीं किया जाता है: वे हमेशा एक्स अथॉरिटी फाइलों में संग्रहित होती हैं, जो "डिस्प्ले :42में कुकी 123456" के रूप के रिकॉर्ड का संग्रह होती हैं । X अथॉरिटी फ़ाइल को आमतौर पर XAUTHORITYपर्यावरण चर में इंगित किया जाता है। यदि $XAUTHORITYसेट नहीं है, तो प्रोग्राम उपयोग करते हैं ~/.Xauthority

आप अपने डेस्कटॉप पर प्रदर्शित होने वाली खिड़कियों पर कार्रवाई करने की कोशिश कर रहे हैं। यदि आप अपने डेस्कटॉप मशीन का उपयोग करने वाले एकमात्र व्यक्ति हैं, तो यह बहुत संभावना है कि प्रदर्शन नाम है :0। एक्स अथॉरिटी फ़ाइल का स्थान खोजना कठिन है, क्योंकि जीडीएम के साथ डेबियन निचोड़ या उबंटू 10.04 के तहत सेट किया गया है, यह एक फ़ाइल में बेतरतीब ढंग से उत्पन्न नाम के साथ है। (आपको पहले कोई समस्या नहीं थी क्योंकि gdm के पुराने संस्करणों ने डिफ़ॉल्ट सेटिंग का उपयोग किया था, अर्थात कुकीज़ को स्टोर किया गया था ~/.Xauthority।)

चरों का मान प्राप्त करना

यहाँ का मान प्राप्त करने के लिए कुछ तरीके हैं DISPLAYऔर XAUTHORITY:

  • आप अपने डेस्कटॉप से ​​व्यवस्थित रूप से एक स्क्रीन सेशन शुरू कर सकते हैं, शायद अपने लॉगिन स्क्रिप्ट्स में (से ~/.profile; लेकिन ऐसा केवल तभी करें जब X के तहत लॉगिंग करें: टेस्ट अगर DISPLAYशुरू होने वाले मान पर सेट हो :(जिसमें उन सभी मामलों को कवर किया जाए, जिनकी आप संभावना रखते हैं मुठभेड़ करना))। इन ~/.profile:

    case $DISPLAY in
      :*) screen -S local -d -m;;
    esac
    

    फिर, ssh सत्र में:

    screen -d -r local
    
  • आप फ़ाइल में DISPLAYऔर मानों को सहेज भी सकते हैं और मानों को XAUTHORITYयाद भी रख सकते हैं । इन ~/.profile:

    case $DISPLAY in
      :*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
    esac
    

    Ssh सत्र में:

    . ~/.local-display-setup.sh
    screen
    
  • आप एक चालू प्रक्रिया से DISPLAYऔर उसके मूल्यों का पता लगा सकते हैं XAUTHORITY। यह स्वचालित करने के लिए कठिन है। आपको एक प्रक्रिया की पीआईडी ​​का पता लगाना होगा जो उस डिस्प्ले से जुड़ी है जिस पर आप काम करना चाहते हैं, फिर पर्यावरण चर /proc/$pid/environ( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')।) से प्राप्त करें ।

कुकीज़ को कॉपी करना

एक अन्य दृष्टिकोण ( एरोमास्टर के एक सुझाव के बाद ) को $XAUTHORITYssh सत्र में मान प्राप्त करने का प्रयास नहीं करना है , लेकिन इसके बजाय X सत्र को अपने कुकीज़ की प्रतिलिपि बनाना है ~/.Xauthority। चूंकि आपके द्वारा लॉग इन करने पर हर बार कुकीज जेनरेट होती हैं, इसलिए यदि आप बासी मान रखते हैं तो यह कोई समस्या नहीं है ~/.Xauthority

यदि आपके घर की निर्देशिका NFS या अन्य नेटवर्क फ़ाइल सिस्टम पर पहुंच योग्य है, तो सुरक्षा समस्या हो सकती है, जो दूरस्थ व्यवस्थापकों को इसकी सामग्री देखने की अनुमति देती है। जब तक आपने एक्स टीसीपी कनेक्शन सक्षम नहीं किया है, तब तक उन्हें किसी भी तरह से आपकी मशीन से कनेक्ट करने की आवश्यकता होगी, (डिबियन डिफ़ॉल्ट रूप से बंद है)। तो ज्यादातर लोगों के लिए, यह या तो लागू नहीं होता है (कोई एनएफएस नहीं) या कोई समस्या नहीं है (कोई एक्स टीसीपी कनेक्शन नहीं)।

जब आप अपने डेस्कटॉप X सत्र में लॉग इन करते हैं तो कुकीज़ की प्रतिलिपि बनाने के लिए, ~/.xprofileया ~/.profile(या जब आप लॉग इन करते हैं तो पढ़ी जाने वाली कोई अन्य स्क्रिप्ट) निम्न पंक्तियों को जोड़ते हैं :

case $DISPLAY:$XAUTHORITY in
  :*:?*)
    # DISPLAY is set and points to a local display, and XAUTHORITY is
    # set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
    XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac

¹ सिद्धांत रूप में इस हवाले से उचित, लेकिन विशेष रूप से में कमी होती है $DISPLAYऔर $XAUTHORITYकिसी भी खोल metacharacter शामिल नहीं होंगे।


2
इसे स्वचालित करने का एक तरीका यह होगा कि ~/.xprofileकेवल एक्स लॉगिन के दौरान ही इसे चलाया जाए और इसे ~/.Xauthorityसही जानकारी के साथ बनाया / अपडेट किया जाए। क्या एक प्रतीकात्मक लिंक पर्याप्त होगा?
अरोमास्टर

@ एरोमास्टर: यह एक अच्छा सुझाव है। मैंने इसके बारे में नहीं सोचा था। यह सभी मामलों में काम नहीं करेगा, उदाहरण के लिए यदि आप एक से अधिक X सत्र (विभिन्न टर्मिनलों पर, vnc,…) के साथ लॉग इन करते हैं, लेकिन यह सरल है, और यह विशिष्ट उपयोग के लिए पर्याप्त है। एक प्रतीकात्मक लिंक सबसे अच्छा तरीका है। हम्म, वास्तव में एक बेहतर, सरल तरीका है: आप जानकारी को कॉपी कर सकते हैं ~/.Xauthority
गाइल्स

1
कई $ DISPLAY के मामले को हल करने xauth extract - $DISPLAY | xauth -f "$HOME/.Xauthority" merge -में कुछ करना चाहेंगे ~/.xprofile?
एरोसमास्टर

@ एरोमास्टर: आप कई डिस्प्ले के साथ क्या समस्या देखते हैं? यद्यपि आपका कोड सिद्धांत में थोड़ा साफ हो सकता है क्योंकि आप केवल उस प्रदर्शन के बारे में जानकारी निकाल रहे हैं जिसमें आप रुचि रखते हैं, मुझे प्रश्नकर्ता के मामले में एक साधारण मर्ज के साथ कुछ भी गलत नहीं दिखता है, या वास्तव में बहुत ही असामान्य परिस्थितियों से बाहर है।
गाइल्स

1
प्रदर्शन से जुड़ी एक मौजूदा प्रक्रिया से पर्यावरण को पढ़ना अप्रत्याशित रूप से आनंददायक बुराई के रूप में है। मैं तहे दिल से मंजूर करता हूं। इसके लिए Unix.SE को एक ईविल जीनियस ™ बैज की जरूरत है।
derobert

19

मैंने इस मुद्दे को जोड़कर हल किया

xhost +si:localuser:$USER

को ~/.xprofile। मुझे नहीं पता कि यह पूरी तरह से सुरक्षित है (मुझे यह जानने में बहुत दिलचस्पी होगी कि अधिक जानकार लोक विचार क्या है), लेकिन मैं अनुमान लगा रहा हूं कि एक्सेस कंट्रोल को बंद करने की तुलना में यह बहुत अच्छा है ( xhost +जैसा कि) आमतौर पर सुझाव दिया जाता है जब आप इस मुद्दे के लिए Google।


1
localuserसर्वर-व्याख्या किए गए पते पूरी तरह से सुरक्षित हैं। डेबियन भी लॉगिन प्रक्रिया (इन /etc/X11/Xsession.d/35x11-common_xhost-local) के हिस्से के रूप में डिफ़ॉल्ट रूप से ऐसा करता है । देखें Xsecurity आदमी पेज अधिक जानकारी के लिए।
सैम मॉरिस

यदि आप एक लैन पर हैं, xhost +तो शायद ज्यादातर मामलों में पर्याप्त है ...
एलेक्सिस विल्के

क्या आप बता पाएंगे कि इस कमांड का क्या मतलब है?
अल्फा_989

@ अल्फ़ा_989: इसका अर्थ है "किसी स्थानीय स्तर पर चलने वाले [स्थानीय व्यक्ति] के लिए एक्सेस [+] जो मेरे [US USER] के रूप में चल रहा है।" "सी" सिर्फ गोंद है (देखें xhost(1)और Xsecurity(7)डॉक्स के लिए)। अपने आप से, यह आदेश है नहीं दूरदराज के उपयोग या X11 अग्रेषण (जिसके लिए "जादू कुकी" तंत्र आम तौर पर अधिक पसंद किया जाता है के किसी भी प्रकार की अनुमति देते हैं xhost)।
केविन

7

आपको export DISPLAY=:0.0


जब एक ही लाइन पर वैरिएबल लिखा होता है तो यूनिक्स को एक्सपोर्ट की आवश्यकता नहीं होती है। वह चर तब तक प्रभावी होता है जब तक कि रेखा समाप्त नहीं हो जाती।
एलेक्सिस विल्के

वास्तव में, आप सही हैं।
asoundmove

यह उत्तर स्पष्ट रूप से गलत है और इसे हटा दिया जाना चाहिए।
पियोट डोब्रोगोस्ट जूल

केवल DISPLAY =: 0.0 टाइप करना नहीं जानता था, चर नाम सेट करेगा। धन्यवाद @asoundmove हालाँकि, मुझे लगता है: 0.0 सर्वर प्रदर्शन पर प्रदर्शन चर के लिए मूल्य है। यदि आप पुट्टी से प्रवेश कर रहे हैं, तो चर का प्रदर्शन 10 या उससे अधिक होना चाहिए। इसलिए यह DISPLAY =: 10
अल्फा_989

3

मेरे लिए काम करता है, डेबियन व्हीज़ी -> ubuntu भरोसेमंद।

नोट: इस मामले में सर्वर प्रदर्शन-प्रबंधक नहीं चला रहा है, यह एक 'हेडलेस' वर्चुअल मशीन है जिसमें कोई ग्राफिक्स कार्ड या मॉनिटर संलग्न नहीं है।

bob@laptop:~$ grep -iB 1 tcp /etc/gdm3/daemon.conf
[security]
DisallowTCP = false
bob@laptop:~$ ssh -C -R 6000:127.0.0.1:6000 alice@server
X11 forwarding request failed on channel 0
alice@server:~$ export DISPLAY=:0.0
alice@server:~$ xterm

लैपटॉप पर एक्स डिस्प्ले, सर्वर पर चलने वाले एक्सटरम का आउटपुट दिखाता है।

डीबग का उपयोग करना:

bob@laptop:~/tmp$ nc -v 127.0.0.1 6001
localhost [127.0.0.1] 6001 (x11-1) : Connection refused
bob@laptop:~/tmp$ nc -v 127.0.0.1 6000
localhost [127.0.0.1] 6000 (x11) open
alice@server:~$ nc -v 127.0.0.1 6000
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!*
alice@server:~$ strace xterm

strace यह क्या कर रहा है के बारे में गोर विवरण का भार उठाएगा, आपको यह अनुमान लगाने में सक्षम होना चाहिए कि यह कहाँ अटक जाता है - एक कनेक्शन के लिए या जो कुछ भी इंतजार कर रहा है।

एक लाइन में ।।

ssh -C -R 6000:127.0.0.1:6000 alice@server "DISPLAY=:0.0 xterm"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.