SSH को बाहर निकलने से रोकने के लिए D-Bus और SSH X- फ़ॉरवर्डिंग को कैसे कॉन्फ़िगर करें?


19

मैं X11 फ़ॉरवर्डिंग और SSH के माध्यम से विभिन्न सूक्ति अनुप्रयोगों को चलाने का प्रयास कर रहा हूं। कुछ एप्लिकेशन पहले 'स्पैनिश-लॉन्च' एप्लिकेशन का कारण बनेंगे। समस्या यह है कि एक्स एप्लिकेशन के बाहर निकलने पर डब-लॉन्च बंद नहीं होता है, और इसलिए एसएसएच सत्र को ठीक से बंद करने से पहले इसे मार दिया जाना चाहिए।

मुझे लगता है कि समस्या यह है कि X / Gnome एप्लिकेशन मुख्य संदेश बस डेमॉन से जुड़ नहीं सकते हैं और इसलिए उन्हें अपनी प्रति लॉन्च करनी चाहिए? मैं इसे कैसे ठीक करूं? या मैं क्या याद कर रहा हूँ?

यहाँ एक उदाहरण है। मेरे पास X11 अग्रेषण सक्षम है, सभी ठीक काम करने लगता है।

[me@host ~]$ gnome-calculator &
[1] 4803

(यहाँ gcalctool प्रोग्राम लॉन्च हुआ है और मेरे एक्स एक्स सर्वर (Xming) को प्रदर्शित किया गया है)

[me@host ~]$ ps
  PID TTY          TIME CMD
 4706 pts/0    00:00:00 bash
 4803 pts/0    00:00:00 gnome-calculator
 4807 pts/0    00:00:00 dbus-launch
 4870 pts/0    00:00:00 ps

(अब, दूरस्थ सत्र में gcalctool ऐप को बंद करने के बाद)

[me@host ~]$ ps
  PID TTY          TIME CMD
 4706 pts/0    00:00:00 bash
 4807 pts/0    00:00:00 dbus-launch
 4898 pts/0    00:00:00 ps

ध्यान दें कि डब-लॉन्च अभी भी सक्रिय है। और सबसे खराब हिस्सा, यह एसएसएच कनेक्शन को ठीक से बंद होने से रोकता है जब तक कि इसे मार नहीं दिया जाता है।

ध्यान दें कि सिस्टम वाइड मैसेज डेमॉन चल रहा है, जैसा कि यहां देखा जा सकता है:

[me@host ~]$ ps ax
 4696 ?     Ssl   0:00 dbus-daemon --system

मुझे यहां क्या समझ नहीं आ रहा है? मैंने यह व्यवहार पहले कभी नहीं देखा। संभवतया, मैंने कभी ऐसे एप्लिकेशन देखे हैं जो संदेश बस डेमॉन से अनहोनी से जुड़ सकते हैं? मैंने उत्तर के लिए / etc / dbus-1 में देखा है, लेकिन यह नहीं जानता कि क्या देखना है।

मदद के लिए अग्रिम धन्यवाद।

[संपादित करें]

ठीक है, मुझे एहसास हो रहा है कि मैं एक आम समस्या का सामना कर रहा हूं। ऐसा लगता है कि यह एक काफी सामान्य व्यवहार है, लेकिन एक अच्छा समाधान के बिना। मैं SSH हैंग का अनुभव कर रहा हूं क्योंकि dbus-launch अभी भी tty में सक्रिय है। लेकिन चुपचाप होने के लिए डब-लॉन्च प्राप्त करने का कोई अच्छा तरीका नहीं है।

/Etc/X11/xinit/xinitrc.d/00-start-message-bus.sh को देखते हुए "सामान्य" X सत्र के साथ जो होना चाहिए, वह कुछ संकेत देता है। यह तब काम नहीं करता है जब किसी X अनुप्रयोग को दूरस्थ X सर्वर पर लागू करने के लिए।

अस्थायी वर्कअराउंड के रूप में, मैंने इसे अपने .bash_logout में जोड़ा है:

# ~/.bash_logout
pkill -u $USER -t `tty | cut -d '/' -f 3,4` dbus-launch

यह SSH सत्र को बंद करने की अनुमति देगा, लेकिन यह हास्यास्पद लगता है। क्या कोई बेहतर उपाय है? डब के बिना दूरस्थ X11 अनुप्रयोगों को चलाने का उचित तरीका क्या है?

जवाबों:


15

प्रति डब-लॉन्च (1):

यदि DBUS_SESSION_BUS_ADDRESS एक ऐसी प्रक्रिया के लिए सेट नहीं है जो डी-बस का उपयोग करने की कोशिश करती है, तो डिफ़ॉल्ट रूप से यह प्रक्रिया नए सत्र की बस शुरू करने या एक्स डिस्प्ले पर मौजूदा बस पते को खोजने के लिए --autolaunch विकल्प के साथ dbus- लॉन्च शुरू करने का प्रयास करेगी। या ~ / .dbus / सत्र-बस / में एक फ़ाइल में

जब भी एक ऑटोलॉन्च होता है, तो एक नया बस शुरू करने के लिए जो एप्लिकेशन होता है, वह अपनी छोटी सी दुनिया में होगा; यदि यह बहुत सारी बस सेवाओं का उपयोग करने की कोशिश करता है, तो यह एक नया सत्र शुरू करने का प्रभावी ढंग से अंत कर सकता है। यह ऐप के आधार पर और इसे करने की कोशिश करने पर निर्भर करता है, यह सबॉप्टिमल या पूरी तरह से टूट सकता है।

ऑटोलंच के दो सामान्य कारण हैं। एक दूरस्थ मशीन के लिए ssh है।

तो ऐसा लगता है कि ट्रिक को डबास-डेमन को प्रारंभिक रूप से शुरू करना है, ऐसे में प्रोग्राम इसे पा सकते हैं। मैं उपयोग करता हूं:

[me@host ~]$ dbus-launch --exit-with-session gnome-terminal

जो, गनोम-टर्मिनल से अलग है, डब-डेमॉन शुरू करता है और गनोम-टर्मिनल के भीतर $ DBUS_SESSION_BUS_ADDRESS सेट करता है ।

गनोम-टर्मिनल से चलने वाले कोई भी एक्स प्रोग्राम तब अच्छी तरह से व्यवहार करते हैं, और जब गनोम-टर्मिनल बाहर निकलता है तो डब-लॉन्च अपने आप साफ हो जाता है।


मैंने इसे उत्तर के रूप में चिह्नित किया है, मुझे यहां आपका समाधान पसंद है। धन्यवाद। पहले एक गनोम-टर्मिनल लॉन्च करना, और फिर उससे अतिरिक्त प्रोग्राम लॉन्च करना मेरे मुद्दे को ठीक करने के लिए लगता है। हालांकि यह नया व्यवहार है? मुझे लगता है कि इस मुद्दे के बिना कई एक्स फॉरवर्डेड विंडोज़ लॉन्च करने में सक्षम होना याद है। शायद नए सूक्ति कार्यक्रम अब Dbus का उपयोग कर रहे हैं, इसलिए मैंने अभी तक यह नहीं देखा है?
taftster

2

मुझे आश्चर्य है कि अज्ञात या अनुभवहीन dbus सत्र के कारण समस्या नहीं आती है।

वास्तव में जब SSH सत्र खुला होता है, तो यह एक dbus सत्र का शुभारंभ नहीं करता है। कुछ कार्यक्रम इसे लॉन्च कर सकते हैं, लेकिन तब सत्र इसके बारे में नहीं जानता (इसलिए इसे बंद नहीं कर सकता)।

डबस सत्र के बारे में न जानने का अर्थ यह भी है कि प्रोग्राम थज़ैट डब का उपयोग करते हैं, लेकिन इसे लॉन्च न करने से खुद को समस्या होगी।

dbus अनुभाग प्रति मशीन और प्रति X11 डिस्प्ले हैं। उनकी जानकारी $ HOME / .dbus / सत्र-बस / - में संग्रहीत की जाती है, हालांकि, वहां संदर्भित प्रक्रिया को बंद किया जा सकता है, इसलिए यह निर्धारित करने के लिए एक अतिरिक्त जांच की आवश्यकता है कि लॉन्चिंग dbus की आवश्यकता है या नहीं। फिर, वहाँ के वेरिएबल्स बेर को सत्र में निर्यात किए जाते हैं।

फिर यह एक आकर्षण की तरह काम करता है :)

मैंने अपनी .bash_profile फ़ाइल में निम्नलिखित डाला:

# set dbus for remote SSH connections
if [ -n "$SSH_CLIENT" -a -n "$DISPLAY" ]; then
    machine_id=$(LANGUAGE=C hostnamectl|grep 'Machine ID:'| sed 's/^.*: //')
    x_display=$(echo $DISPLAY|sed 's/^.*:\([0-9]\+\)\(\.[0-9]\+\)*$/\1/')
    dbus_session_file="$HOME/.dbus/session-bus/${machine_id}-${x_display}"
    if [ -r "$dbus_session_file" ]; then
            export $(grep '^DBUS.*=' "$dbus_session_file")
            # check if PID still running, if not launch dbus
            ps $DBUS_SESSION_BUS_PID | tail -1 | grep dbus-daemon >& /dev/null
            [ "$?" != "0" ] && export $(dbus-launch) >& /dev/null
    else
            export $(dbus-launch) >& /dev/null
    fi
fi

नोट्स: hostnamectl systemd का हिस्सा है और मशीन-आईडी को पुनः प्राप्त करने की अनुमति देता है, जिसे हम चाहते हैं कि वैरिएबल-लॉन्च प्रदर्शित करता है; उपयोग करके export $(dbus-launch)हम डब-लॉन्च के आउटपुट को पुनः प्राप्त करते हैं और चर निर्यात करते हैं

यदि आप चाहते हैं कि यह गैर-संवादात्मक सेसियो पर किया जाए (जैसे ssh से कमांड चलाते समय) तो इसे .bashrc में डालने का प्रयास करें (लेकिन सावधान रहें कि bashrc को EVEERY खोल के खोल पर निष्पादित किया गया है)


1

दूरस्थ X कमांड चलाने का प्रयास करते समय मुझे एक ही समस्या थी, और X उपकरण के बाहर निकलने के बाद सत्र से बाहर निकलें।

इसलिए मैं भागना चाहता था

ssh -X user@remotehost "firefox -no-remote"

लेकिन उपयोग करना था:

ssh -X user@remotehost 'export \`dbus-launch\`; dbus-launch firefox -no-remote; kill -TERM $DBUS_SESSION_BUS_PID'

फ़ायरफ़ॉक्स बंद करने के बाद यह ssh सत्र को भी बंद कर देगा।

अपडेट :

ऐसा लगता है कि सर्वर पर चल रहे dbus-daemon प्रक्रियाओं का भार छोड़ दिया गया है, इसलिए यह इष्टतम नहीं है, दोनों खातों पर -exit-with-session को जोड़ने से मदद नहीं मिलती है, क्योंकि यह मूल व्यवहार को प्रभावित करता है

अद्यतन 2 : यह तब काम करता है जब मैं एकल उद्धरणों का उपयोग करता हूं, (जैसा कि @lobo द्वारा सुझाया गया है) और kill -TERM $DBUS_SESSION_BUS_PIDबचे हुए डब-डेमन प्रक्रियाओं को मारने के लिए, जैसा कि Holgr Joukl द्वारा https://blog.dhampir.no/content-how-how से प्रस्तावित किया गया है । से-एसश-एक्स-एक्स-से-हैंगिंग-ऑन-एग्जिट-जब-डब-इज़-यूज़ )


आपको अंतिम आदेश में एकल उद्धरण का उपयोग करना होगा (अन्यथा स्थानीय रूपdbus-launch से चलाया जाता है ), लेकिन फिर यह काम करता है। धन्यवाद!
l0b0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.