क्या मैं रूट के रूप में किसी अन्य उपयोगकर्ता के डेस्कटॉप पर एक ग्राफिकल प्रोग्राम लॉन्च कर सकता हूं?


39

निम्नलिखित अन्य प्रश्न हैं जो मुझे लगता है कि मुझे जानना चाहिए:

  • एक गैर एक्स सत्र से? (अर्थ रूट X में लॉग इन नहीं है)

  • यदि एक्स पर कई लोगों को लॉग इन किया गया था, तो क्या मैं पता लगा सकता हूं कि कौन किस स्क्रीन पर था, और इस तरह प्रोग्रामेटिकली पता लगाऊंगा कि मुझे किस स्क्रीन पर ऐप लॉन्च करना है?

  • क्या मैं उपयोगकर्ता के रूप में ऐप लॉन्च कर सकता हूं? (ठीक है मैं 99.999% यकीन है कि यह एक हाँ है)

  • क्या मैं पता लगा सकता हूं कि क्या समूह X के उपयोगकर्ता X में लॉग इन हैं?


ध्यान रखें कि naga_plugged.plस्क्रिप्ट खत्म (या पृष्ठभूमि में कांटे), क्योंकि udevइसके बाहर निकलने का इंतजार किया जाएगा।
rozcietrzewiacz

धन्यवाद मैंने इसे c कोड में डेमन (0,0) कॉल करके एक डेमन बना दिया, जो कि naga_plugged.pl कॉल अंतिम है। मैं नया कभी नहीं था कि उनके यहाँ यूनिक्स फोरम हैं। उन्हें नए डोमेन के बजाय इसे सभी एक साइट बनाना चाहिए।
over_optimistic

जवाबों:


23

उपयोगकर्ता के डेस्कटॉप पर एक ग्राफिकल प्रोग्राम लॉन्च करने के लिए, आपको दो चीजों को खोजने की जरूरत है: उपयोगकर्ता का डेस्कटॉप क्या है (पता) और क्या प्राधिकरण कुकी का उपयोग करता है (पासवर्ड)।

निम्न आदेशों को उन स्थानीय डिस्प्ले को सूचीबद्ध करना चाहिए जिन्हें उपयोगकर्ता अधिकांश यूनियनों पर (एक प्रति पंक्ति) लॉग ऑन करता है:

who | awk -v user="$target_user" '$1 == user && $2 ~ "^:" {print $2}'

प्राधिकरण कुकी ढूंढना थोड़ा कठिन है। आपको उपयोगकर्ता की कुकी फ़ाइल को देखना होगा, जो ~/.Xauthorityकि डिफ़ॉल्ट रूप से है (आपको सभी की आवश्यकता कुकी फ़ाइल का स्थान है, आपको कुकी को इसमें से निकालने की आवश्यकता नहीं है)। यह कई प्रणालियों पर काम करता है, लेकिन सभी नहीं; यह डिस्प्ले मैनेजर पर निर्भर करता है और इसे कैसे सेट किया जाता है, और विशेष रूप से जीडीएम (उबंटू पर डिफ़ॉल्ट) ने अंतिम स्थान का उपयोग नहीं किया जो मैंने देखा था। मैं वास्तविक एक्स कुकी फ़ाइल का पता लगाने के लिए एक पोर्टेबल तरीके के बारे में नहीं सोच सकता। यह पता लगाने का सबसे सटीक तरीका है कि एक्स प्रक्रिया की पिड का पता लगाना और -authविकल्प के लिए तर्क की तलाश करना । दूसरा तरीका यह है कि उस एक्स सर्वर पर चलने वाली प्रक्रिया को खोजा जाए और उसके XAUTHORITYएनवायरमेंट वेरिएबल को पकड़ा जाए। यदि आपको कुकी फ़ाइल ढूंढने में समस्या है, तो देखेंएक दूरस्थ एक्स डिस्प्ले पर एक विंडो खोलें (क्यों "ओपन डिस्प्ले नहीं कर सकता")?

एक बार जब आपके पास दोनों जानकारी हो जाती है, तो चुने हुए प्रदर्शन को DISPLAYपर्यावरण चर में, चुने हुए X प्राधिकरण कुकी फ़ाइल को पर्यावरण चर में डालें XAUTHORITY, और आप सेट हो गए हैं। इससे कोई फर्क नहीं पड़ता कि प्रोग्राम किस उपयोगकर्ता के रूप में चलता है; suआप की तरह के साथ गठबंधन ।


आपका "-auth विकल्प के लिए तर्क" कैसे दिखता है?
रूडो77


ठीक है, तो pids=$(pgrep -u $target_user nautilus)पिड मिलता है, और मुझे एक -authविकल्प कहां रखना है?
रूबो77

1
@ rubo77 आप -authकहीं भी एक विकल्प नहीं रखते हैं। XAUTHORITYपर्यावरण चर में क्या रखा जाए, यह जानने के लिए आपको एक्स सर्वर प्रक्रिया की कमांड लाइन में इसे देखना पड़ सकता है । यदि आपके पास एक ग्राहक की प्रक्रिया है, तो आपको जो कुछ भी चाहिए वह -authउस ग्राहक के XAUTHORITYचर के मूल्य के बारे में कुछ भी नहीं है । मुझे समझ नहीं आ रहा है कि आप क्या करने की कोशिश कर रहे हैं। आप एक नया प्रश्न पूछना चाहते हैं।
गिल्स एसओ- बुराई को रोकना

मैं आपकी जानकारी का उपयोग करने की कोशिश कर रहा हूं कि यह हल करने के लिए कि रूट द्वारा शुरू की गई स्क्रीन पर एक सूचना
rubo77

11

मैं पूरी तरह से यह कोशिश नहीं कर सकता क्योंकि मेरी सभी मशीनें रूट अक्षम हैं।

यह पता लगाने के लिए कि उपयोगकर्ता किस डिस्प्ले पर है, आप whoकमांड का उपयोग कर सकते हैं । आउटपुट का अंतिम कॉलम आमतौर पर प्रदर्शन होता है जिसे उपयोगकर्ता लॉग ऑन करता है। कुछ इस तरह से सिर्फ डिस्प्ले को हथियाने के लिए इस्तेमाल किया जा सकता है (ऐसा करने के लिए कहीं अधिक कुशल तरीका है, संपादन की पेशकश करने के लिए स्वतंत्र महसूस करें):

who | grep -m1 ^username.*\( | awk '{print $5}' | sed 's/[(|)]//g'

फिर उस डिस्प्ले पर एक ग्राफिकल X कमांड लॉन्च करने के लिए:

DISPLAY=:0 firefox &

जहाँ: 0 को आप पहले कमांड में पाए जाने वाले डिस्प्ले से बदल दिया जाएगा और फ़ायरफ़ॉक्स को आप जो भी कमांड चलाना चाहते हैं उसे बदल दिया जाएगा। आप इसे शेल स्क्रिप्ट में रख सकते हैं और बस एक चर का उपयोग कर सकते हैं।

अगला भाग वह भाग है जिसका मैंने परीक्षण नहीं किया है, लेकिन मैं यह नहीं देखता कि ऐसा करना क्यों संभव नहीं है:

su username -c "DISPLAY=:0 firefox"

उस उपयोगकर्ता के रूप में एक्स कमांड लॉन्च करने के लिए।


1
सिर्फ इसलिए कि रूट अक्षम है इसका मतलब यह नहीं है कि सामान रूट के रूप में नहीं चलता है;) मुझे वास्तव में इसे एक स्क्रिप्ट के रूप में चलाने की आवश्यकता है जो रूट के रूप में चल रही है।
xenoterracide

@xenoterracide, सही। मेरा मतलब था कि मैं हर संभव परिस्थितियों में इसका परीक्षण नहीं कर सकता था। यही है, मैंने केवल इसे रूट रूट के रूप में परीक्षण किया है और यह sudo -iसुनिश्चित नहीं किया जा सकता है कि क्या परिणाम सीधे रूट के रूप में लॉग इन करने के बाद इसे चलाने से अलग होंगे। :-)
स्टीवन डी

मुझे थोड़ा संशोधित करना पड़ा। यह who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ काम करने लगता है ...
xenoterracide

क्यों किसी ने भी grep और sed का उपयोग किया है जब पहले से ही जंजीर में जगा हुआ है मेरे से परे है।

हाँ ... "थोड़ी देर के लिए सीखना" अब मेरी टूडू सूची में है।
स्टीवन डी

4

आप देख सकते हैं कि यह कैसे करता है। जैसे जब यह xscreensaver कमांड जारी करता है या X या X-session चलाने वाले प्रत्येक उपयोगकर्ता के लिए स्क्रीन को खाली करता है।

उदाहरण के लिए उबंटू के तहत इस फाइल में संबंधित सामग्री है:

/etc/acpi/lid.sh

इसमें यह लूप शामिल है:

for x in /tmp/.X11-unix/*; do
    displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
    getXuser;
    if [ x"$XAUTHORITY" != x"" ]; then
        export DISPLAY=":$displaynum"
        grep -q off-line /proc/acpi/ac_adapter/*/state
        if [ $? = 1 ]
            then
            if pidof xscreensaver > /dev/null; then 
                su $user -c "xscreensaver-command -unthrottle"
            fi
        fi
        if [ x$RADEON_LIGHT = xtrue ]; then
            [ -x /usr/sbin/radeontool ] && radeontool light on
        fi
        if [ `pidof xscreensaver` ]; then
            su $user -c "xscreensaver-command -deactivate"
        fi
        su $user -c "xset dpms force on"
    fi
done

विशेष रूप से, कोड में है /usr/share/acpi-support/power-funcs। यह fgconsoleसक्रिय लिनक्स वीटी को खोजने के लिए कॉल करता है, फिर इस कंसोल पर प्रदर्शित होने वाले एक एक्स सर्वर की तलाश करता है, और वहां से उपयोगकर्ता का पता लगाता है। फिर यह ~/.Xauthorityएक्स कुकी के रूप में उपयोग करता है , जब तक कि कुछ ऐसा न हो कि मैं गायब हूं इसका मतलब यह है कि यह वास्तव में एक्स सर्वर से कनेक्ट नहीं हो पाएगा (उबंटू का डिफ़ॉल्ट सेटअप, जीडीएम का उपयोग करके, उपयोगकर्ता के घर में एक्स कुकीज़ को स्टोर नहीं करता है निर्देशिका)।
गाइल्स का SO- बुराई पर रोक '

@ गाइल्स लिड.श उदाहरण के लिए getXconsole को नहीं कहते हैं। इस प्रकार, fgconsole का उपयोग नहीं किया जाता है। मैंने मन में आए स्निपेट के साथ उत्तर को अपडेट किया। और यह वास्तव में उबंटू पर काम करता है। ढक्कन बंद करने पर स्क्रीन खाली हो जाती है।
मैक्सक्लेपज़िग

1
Ubuntu 14.04 में मुझे त्रुटि मिलती हैgetXuser: command not found
rubo77

1

गाइल्स उत्तर का एक विस्तार यह है कि कुकी फ़ाइल को कैसे खोजें। ऐसा करने का एक तरीका यह हो सकता है कि आप DISPLAYपर्यावरण चर (गाइल्स द्वारा वर्णित) सेट करने के बाद , straceफ़ाइलों xhostतक पहुँचने के लिए उपयोग करें। मैं कुछ इस तरह से BASH में सोच सकता हूं:

# Set the DISPLAY variable first
DISPLAY = :0.0
# Use strace on xhost
strace xhost 2>&1 | grep access

ऊपर दिए गए कोड से आउटपुट ऐसा दिखेगा:

access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
access("/home/someuser/.Xauthority", R_OK) = 0

जैसा कि आप स्पष्ट रूप से देख सकते हैं, कुकी फ़ाइल यहां सीधे दिखाई देगी।


0

जीयूआई या एक्स टास्क को सीमित वातावरण जैसे udv रूल्स या सुपर-यूजर से प्रदर्शित करने के लिए एक सुरुचिपूर्ण तरीका खोजने के अपने शोध में, मैंने हाल ही में इसके साथ फिट होने के लिए एक टूल बनाया ( अधिक विवरण के लिए )।

xpub वर्तमान या किसी दिए गए TTY के संबंध में X प्रदर्शन वातावरण के चर प्राप्त करने के लिए एक शेल स्क्रिप्ट है।

यह एक udev नियम के साथ एक उदाहरण है:

IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"

$env{ENV}: यदि वर्तमान-टैटी-उपयोगकर्ता X शुरू करता है, तो इसे हटा दें।

सिद्धांत कमांड लाइन का उपयोग करने के लिए समान है export:

export $(xpub) ; su ${XUSER} -c 'notify-send Hello'

1
मेरा सुझाव है कि आप इसे स्पष्ट करें कि आप इस xpub स्क्रिप्ट के लेखक हैं।
दिमित्री ग्रिगोरीव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.