एक और (गैर-रूट) उपयोगकर्ता के रूप में GUI अनुप्रयोग चलाना


34

चलो कहते हैं कि मैं 2 उपयोगकर्ता खाते हैं user1और user2। जब मैं के रूप में प्रवेश user1, और फिर करने के लिए स्विच user2का उपयोग कर su, मैं कमांड लाइन कार्यक्रमों निष्पादित कर सकते हैं, लेकिन जीयूआई कार्यक्रमों असफल।

उदाहरण:

user1@laptop:~$ su - user2
user2@laptop:~$ leafpad ~/somefile.txt
No protocol specified
leafpad: Cannot open display: 

तो मैं GUI एप्लिकेशन कैसे चला सकता हूं?


मुख्य कारणों में से एक, मैंने पाया है कि यह विफल रहता है क्योंकि $XAUTHORITYअभी भी user1 के लिए सेट है ~/.Xauthority, जो कि प्रोग्राम, मुझे लगता है, पढ़ने की कोशिश करेगा, और यह विफल रहता है क्योंकि उस फ़ाइल में आमतौर पर मोड 0600 ( -rw-------) है, जिसका अर्थ है कि यह अनुपलब्ध है "अन्य" समूह में किसी के द्वारा पढ़ने के लिए, जिसमें user2 शामिल है। मतलब अगर आप chmod o+r ~/.Xauthority(user1 के रूप में), तो आप इस समस्या के आसपास अपना रास्ता हैक कर लेंगे। मैंने एक स्क्रिप्ट लिखी जो इसे प्रदर्शित करती है।
ब्रैडेन बेस्ट

जवाबों:


42

सु बनाम सु -

जब आप एक और उपयोगकर्ता बनना चाहते हैं तो आप आमतौर पर उपयोग करना चाहते हैं su - user2। डैश यूज़र 2 .bash_profileको सोर्स करने के लिए मजबूर करेगा ।

xhost

इसके अतिरिक्त आपको उपयोगकर्ताओं को अपने प्रदर्शन तक पहुंच प्रदान करने की आवश्यकता होगी। यह X द्वारा शासित है। आप xhost +उपयोगकर्ता के डेस्कटॉप पर GUI को प्रदर्शित करने के लिए अन्य उपयोगकर्ताओं को अनुमति देने के लिए कमांड का उपयोग कर सकते हैं ।

नोट: जब xhost +आप चलाना चाहते हैं, तो यह अभी भी शेल में चल रहा है जो user1 का है।

$ प्रदर्शन

जब आप user2 हो जाते हैं तो आपको पर्यावरण चर सेट करने की आवश्यकता हो सकती है $DISPLAY

$ export DISPLAY=:0.0

1
xhost +user2अभी भी मुझे इस त्रुटि देता है - xhost: bad hostname "user2"। मैं कुछ googled, और ऐसा लगता है कि मुझे करने की ज़रूरत है xhost +user2@laptopया xhost +user2@localhost, जो निश्चित नहीं है। फिर यह कहता है xhost +user2@localhost being added to access control list
शशोअल्म

1
लेकिन उपयोगकर्ता को जोड़ने xhostऔर निर्दिष्ट करने के बाद भी export DISPLAY=:0.0, रनिंग leafpadअभी भी मुझे देता है No protocol specified leafpad: Cannot open display:, और चलाने में विफल रहता है। मुझे यह लिंक linuxquestions.org/questions/linux-newbie-8/… पर मिला , जिसमें कहा गया है कि कुछ मैजिक कुकीज और हैं xauth। क्या आपने परीक्षण किया है कि वे चीजें आपके कंप्यूटर पर काम करती हैं? शायद मेरे विन्यास के साथ कुछ अलग है? मैं डेबियन + LXDE पर हूं।
शशोअल्म

1
धन्यवाद, xhost +काम करता है, और कुछ और नहीं लगता है (सेट करने की आवश्यकता नहीं है $DISPLAY)। क्या आप अपना जवाब अपडेट कर सकते हैं, और मैं इसे स्वीकार करूंगा?
शशोअल्म

5
ओह, कुछ पाया। फेडोरा 21 पर चल रहे xhostप्रारूप में एक सूची देता है SI:localuser:USERNAME, इसलिए xhost SI:localuser:user2काम करना चाहिए। ओह और उपयोगकर्ता के प्रदर्शन का उपयोग करके पाया जा सकता है w
विल्फ

7
xhost +किसी भी होस्ट पर किसी भी उपयोगकर्ता को अनुमति देगा जो आपकी स्क्रीन तक पहुंचने के लिए आपके एक्स-सर्वर से जुड़ सकता है। xhost +SI:localuser:user2डेबियन पर मेरे लिए काम करता है।
लुटार्ट्स

9

आप प्रमाणीकरण से टोकन साझा करने की आवश्यकता user1 (यह मानते हुए ~का घर है user1 ):

cat ~/.Xauthority | sudo -u user2 -i tee .Xauthority > /dev/null

1
यह एकमात्र उत्तर है जिसने मेरे लिए काम किया (उबंटू 14)।
sudo

यह समाधान दूरस्थ मशीन (= X विन क्लाइंट) के भीतर से अच्छी तरह से काम करता है, जबकि अन्य उत्तरों में xhost समाधान को स्थानीय मशीन (= X विन सर्वर) पर निष्पादित किया जाना है।
Jpsy

tee -aकिसी भी मौजूदा जानकारी को हटाने से बचने के लिए इसका उपयोग करना अधिक सुरक्षित हो सकता है  .Xauthority
स्कॉट

7

आप X11 अग्रेषण का उपयोग कर सकते हैं:

ssh -XY otheruser@localhost your-gui-program-name-here

यह एक शानदार समाधान है। मैं अब तक सबसे सरल पढ़ा हूँ। X11 कॉन्फ़िगरेशन की तुलना में बहुत अधिक लोग ssh से परिचित हैं।
एलेक्सिस पानियागिओटोपोलोस

6

आप दूसरे उपयोगकर्ता से ऐप शुरू कर सकते हैं। मैं उपयोगकर्ता 1 से लॉग इन करते समय (GUI) उपयोगकर्ता 2 से जिम्प ऐप शुरू करूंगा:

$ xhost +
$ sudo su user2

(पास पास)

$ gimp

का आनंद लें :)


4
यह चार साल पुराने स्वीकृत उत्तर के समान है।
जी-मैन का कहना है कि 'मोनिका'

क्या आप जल्दी बेहतर तरीका बता सकते हैं?
एंटोनी स्टावरव

मैंने हमेशा इस विधि का उपयोग किया है, लेकिन यह अब मेरे लिए डेबियन और Xfce के साथ काम नहीं कर रहा है। ( सुधार : यह काम करता है, लेकिन मुझे export DISPLAYपहले करना होगा, जैसा कि स्वीकृत उत्तर कहता है)
जिउती

आपके द्वारा अपना सत्र समाप्त करने के बाद इसे निष्क्रिय करना अच्छा होगा$ xhost -
एंटनी स्ट्रेव

4

आप sux कमांड आज़मा सकते हैं:

sux user2

sux आपके लिए $ DISPLAY सामग्री को संभाल लेगा। आपको इसे स्थापित करने की आवश्यकता हो सकती है:

sudo apt-get install sux

डेबियन / उबंटू के तहत।


4
suxअब डेबियन या उबंटू द्वारा शिप नहीं किया गया है। सबसे अच्छा विकल्प मुझे मिल सकता है xhost SI:localuser:root(या जो भी उपयोगकर्ता) ~/.xprofileइसे स्थायी रूप से या उपयोग करने की अनुमति दे रहा हैrunuser
stefanct

डेबियन स्ट्रेच तक और सहित, वहाँ gksu/ gksudoविकल्प था जो ठीक काम करता था। सिड में अभी भी, इसे सुरक्षा मुद्दों के लिए बस्टर में हटा दिया गया है।
मतिजा नालिस

0

विकल्प के रूप में sux, सुरक्षित रूप से ग्राफ़िकल कमांड चलाने के firefox-esrलिए ( उदाहरण के लिए नीचे) $AUTHUSER( guestनीचे उदाहरण में):

AUTHUSER=guest
AUTHSTRING=SI:localuser:${AUTHUSER}
xhost +${AUTHSTRING} > /dev/null
SUDO_ASKPASS=/usr/bin/ssh-askpass
export SUDO_ASKPASS
sudo -k --askpass -u ${AUTHUSER} /usr/bin/firefox-esr
xhost -${AUTHSTRING} > /dev/null
sudo -K

कोड करता है:

  1. देता है guestअपने वर्तमान उपयोगकर्ता के लिए उपयोगकर्ता पहुँच $DISPLAYके माध्यम सेxhost +SI:localuser:guest
  2. ssh-askpassपासवर्ड का उपयोग करने के लिए आपसे पासवर्ड मांगता है (निश्चित रूप से, आप इससे sudoers(5) NOPASSWD:बचने के लिए उपयोग कर सकते हैं , यदि आपकी सुरक्षा नीति ठीक है। या आप अन्य askpassकार्यक्रमों का उपयोग कर सकते हैं , या उन्हें कॉन्फ़िगर फ़ाइलों में निर्दिष्ट कर सकते हैं ( sudo(8)विवरण के लिए देखें --askpass)
  3. यदि पासवर्ड ठीक है (और आपके पास अनुमतियाँ हैं sudoers(5)) तो यह कमांड /usr/bin/firefox-esrको किसी अन्य उपयोगकर्ता ( guest) के रूप में चलाता है
  4. कार्यक्रम पूरा होने के बाद, अन्य उपयोगकर्ता ( guest) को आपके $DISPLAYद्वारा एक्सेस करने की अनुमति रद्द कर दी जाती हैxhost -SI:localuser:guest
  5. अंत में, sudo -Kकैश्ड पासवर्ड को हटा देता है, इसलिए अगला चालान ssh-askpassआपसे पासवर्ड के लिए फिर से पूछेगा (कैश्ड पासवर्ड का उपयोग करने के बजाय)

    जबकि यह क्या है gksu(8)या क्या sux(8)किया गया है इसकी तुलना में थोड़ा अधिक काम है , इसे स्क्रिप्ट किया जा सकता है, और यह बहुत अधिक सुरक्षित है:

    • xhost + (कोई भी उपयोगकर्ता आपके ग्राफिकल डिस्प्ले तक तब तक पहुंच सकता है, जब तक वह प्रभाव में है)
    • अन्य उपयोगकर्ताओं द्वारा पठनीय ~ / .xauth (आपके प्रदर्शन के लिए उस उपयोगकर्ता द्वारा अनिश्चितकालीन पहुंच)
    • क्या gksu/ suxकिया (अस्थायी प्रति ~/.Xauthority, जिसने निर्दिष्ट उपयोगकर्ता को आपकी प्रतिलिपि बनाने की अनुमति दी MIT-MAGIC-COOKIE-1और gksu / sux समाप्त होने के बाद भी अपना प्रदर्शन जारी रखना जारी रखा (जब तक आपने मशीन को बंद नहीं किया या प्रदर्शन से बाहर नहीं किया गया - स्क्रीनसेवर, हाइबरनेट आदि ने जादू नहीं बदला) कुकी)।

क्योंकि यह आपके प्रदर्शन के लिए केवल एक स्थानीय उपयोगकर्ता को एक्सेस करने की अनुमति देगा, और तब तक केवल जब तक कमांड चलता है (जब कमांड समाप्त होता है, $AUTHUSERअब आपके डिस्प्ले को किसी भी तरह से एक्सेस करने में सक्षम नहीं होगा)।

एक और सुरक्षित विकल्प है ssh -X(बिना -Yजो वास्तव में आप कम सुरक्षित बनाता है! देखने ForwardX11Trustedमें ssh_config(5)जानकारी के लिए), के रूप में यदि आप इसे स्क्रिप्ट नहीं कर रहे हैं का उपयोग करना आसान है, लेकिन यह additinal ओवरहेड को प्रेरित करता है (उदाहरण के लिए। यह धीमी है) और कुछ कार्यक्रमों को सही ढंग से काम नहीं कर सकते बिना असुरक्षित -Y


-1

आप के रूप में स्थापना यूआई लोड करने के लिए की जरूरत है user2

इसका अनुसरण करने का प्रयास करें:

रूट के रूप में लॉगिन करें :

sudo su

एक्स सर्वर का परीक्षण करें:

xclock

यदि आप एक घड़ी को दौड़ते हुए देख सकते हैं, तो जाना अच्छा है, अब इसे चलाने का प्रयास करें:

xhost

परिणाम इस तरह होना चाहिए:

xhost SI:localuser:tri
# tri is my user name

अब user2 को xhost एक्सेस करें

xhost +SI:localuser:user2

अब user2 में फिर से लॉगिन करने का प्रयास करें और किसी भी GUI प्रोग्राम को खोलने का प्रयास करें।


(१) इस सवाल में कुछ भी नहीं है कि जड़ के रूप में चलने की आवश्यकता है, या जड़ के रूप में दौड़ना फायदेमंद है। (1 बी) यदि कुछ भी हो, तो रूट के रूप में चलना केवल मामलों को भ्रमित कर सकता है। (2) शायद ही कभी (यदि कभी हो) उपयोग करने का कोई कारण हो sudo su। उपयोग  sudoया  su; एक चुनें। (३) प्रश्न के संदर्भ में user1और  लिखा है  user2। कृपया के संदर्भ में अपने जवाब लिखने  user1और  user2। (करो या न करो; नहीं है  tri।) (4) आपका उत्तर बेहतर होगा यदि इसमें स्पष्टीकरण शामिल है  SI:localuser। ……………… कृपया टिप्पणियों में प्रतिक्रिया न दें;  इसे स्पष्ट और अधिक पूर्ण बनाने के लिए अपना उत्तर संपादित करें।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.