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


15

मैं यह जानने की कोशिश कर रहा हूं कि GUI एप्लिकेशन को किसी अन्य उपयोगकर्ता के रूप में कैसे लॉन्च किया जाए, जो उस उपयोगकर्ता के ग्राफिकल सत्र में अंतःक्रियात्मक रूप से लॉग इन हो।

उदाहरण के लिए, मान लें कि मेरे दो उपयोगकर्ता हैं, फू और बार। दोनों में लॉग इन किया जाता है, लेकिन वर्तमान इंटरैक्टिव उपयोगकर्ता foo है। मैं उपयोगकर्ता "बार" के रूप में कैलक्यूलेटर लॉन्च करना चाहता हूं, ताकि जब मैं उपयोगकर्ता को बार में स्विच करूं, तो मुझे लगता है कि बार के सत्र में कैलकुलेटर विंडो खुली है।

यहाँ मैंने कोशिश की है कि काम न करे:

sudo -u bar /Applications/Calculator.app/Contents/MacOS/Calculator

यह कैलक्यूलेटर.app को बार के रूप में लॉन्च करता है, लेकिन विंडो फू के ग्राफिकल सत्र में खुलती है।

sudo -u bar osascript -e "tell application \"Calculator\" to activate"

एक ही प्रभाव।

sudo -u bar open "/Applications/Calculator.app"

कैलकुलेटर को फू के रूप में लॉन्च करता है, बार में नहीं।

launchctl asuser [uid of bar] [any of the above commands]

एक ही प्रभाव।

क्या इसे पूरा करने का कोई रास्ता है? मैं संभावित समाधान के सभी तरीकों का मनोरंजन करने के लिए तैयार हूं, जिसमें बैश स्क्रिप्टिंग, AppleScript, कोर फाउंडेशन या कोको प्रोग्राम लिखना, और इसी तरह शामिल हैं। मेरी स्थिति में, कोई भी प्रोग्राम या स्क्रिप्ट रूट सहित किसी भी उपयोगकर्ता के रूप में निष्पादित हो सकता है।

नोट: मुझे पता है कि यह दूरस्थ Apple ईवेंट्स का उपयोग करना संभव है, लेकिन मैं इसका उपयोग नहीं कर सकता क्योंकि जिस स्थिति में मैं यह करने की कोशिश कर रहा हूं, मुझे इसकी कोई गारंटी नहीं है कि "दूरस्थ Apple ईवेंट्स" साझाकरण प्राथमिकताओं में सक्षम होंगे।

किसी भी तरह की सहायता का स्वागत किया जाएगा!


1
क्या आपने openकमांड का उपयोग करके कोशिश की SSH?
Matthieu Riegler

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

मुझे लगता है कि इस पहेली के एक टुकड़े में -psn कमांड लाइन तर्क शामिल हो सकता है, जिसे ओएस कुछ स्थितियों में जोड़ता है। जब मैंने OS X पर कुछ कोड पोर्ट करने पर काम किया है, तो मैंने अतीत में इसका सामना किया है। यह प्रश्न देखें और Apple दस्तावेज़ीकरण इसे संदर्भित करता है।
एशले

के रूप में 10.10 पर पिछले
bellowec

जवाबों:


7

आप जो हासिल करना चाहते हैं वह संभव है लेकिन मुश्किल है। आपको उपयुक्त उपयोगकर्ता सत्र के भीतर एप्लिकेशन लॉन्च करना होगा। सुरक्षा कारणों से, उपयोगकर्ता सत्र को विभाजित करना मुश्किल है।

आपको अपने अनुरोध को सुनने और अपनी ओर से एप्लिकेशन लॉन्च करने के लिए दूसरे उपयोगकर्ता के सत्र में पहले से चल रही प्रक्रिया की आवश्यकता है।

लॉन्च का bsexec

शुक्र है, हाल के संस्करणों में launchdयह क्षमता है; हालांकि Apple इंजीनियरों ने इसके सामान्य उपयोग की सिफारिश नहीं की है। उपयुक्त उपयोगकर्ता सत्र को लक्षित करने के लिए लॉन्चरbsexec में विकल्प का उपयोग करें :

 bslist [PID | ..] [-j]
          This prints out Mach bootstrap services and their respective states. While the namespace
          appears flat, it is in fact hierarchical, thus allowing for certain services to be only avail-
          able to a subset of processes. The three states a service can be in are active ("A"), inactive
          ("I") and on-demand ("D").

          If [PID] is specified, print the Mach bootstrap services available to that PID. If [..] is
          specified, print the Mach bootstrap services available in the parent of the current bootstrap.
          Note that in Mac OS X v10.6, the per-user Mach bootstrap namespace is flat, so you will only
          see a different set of services in a per-user bootstrap if you are in an explicitly-created
          bootstrap subset.

          If [-j] is specified, each service name will be followed by the name of the job which regis-
          tered it.

 bsexec PID command [args]
          This executes the given command in the same Mach bootstrap namespace hierachy as the given
          PID.

 bstree [-j]
          This prints a hierarchical view of the entire Mach bootstrap tree. If [-j] is specified, each
          service name will be followed by the name of the job which registered it.  Requires root priv-
          ileges.

अनुशंसित दृष्टिकोण एक लॉन्च जॉब टिकट लिखना और मैक को पुनरारंभ करना है - या उपयोगकर्ता को लॉग-आउट करने और फिर से वापस करने के लिए कहें।

समस्याओं का कारण

आवेदन गलत WindowServerप्रक्रिया से जुड़े होने से समस्याएँ उत्पन्न होती हैं। प्रत्येक उपयोगकर्ता सत्र में एक अलग WindowServer है; यह प्रक्रिया उपयोगकर्ता इंटरफ़ेस को संभालती है। आपके पहले के तरीके सही उपयोगकर्ता के साथ प्रक्रिया के स्वामित्व को रखते हैं लेकिन आपकी स्वयं की WindowServer प्रक्रिया से जुड़े होते हैं।

इस समस्या का उल्लेख Apple के Daemons and Agent तकनीकी नोट में है।

अनुभव

मैं इसे अपने निजी अनुभव से जानता हूं। पावर मैनेजर के लिए, मैंने प्रत्येक उपयोगकर्ता सत्र के भीतर मौजूद होने के लिए pmuser लिखा । pmuserहमारे डेमॉन को सुनता है और प्रति-उपयोगकर्ता लॉन्च और कमांड को संभालता है। हमारे डेमॉन के मूल अधिकार होने के बावजूद, हमें अभी भी उपयोगकर्ता सत्रों के भीतर मज़बूती से काम करने के लिए प्रति-उपयोगकर्ता प्रक्रिया की आवश्यकता है।


क्या आप एक साधारण स्क्रिप्ट प्रदान कर सकते हैं, जैसे कि टीजे के उत्तर में, लेकिन एक काम करता है? या ऐसी बात के लिए यह बहुत जटिल है?
क्रैगॉक्स

छोटी स्क्रिप्ट के लिए सही समाधान बहुत जटिल है। आदर्श रूप से, लक्ष्य उपयोगकर्ता सत्र में एक अलग trampoline जैसी प्रक्रिया की आवश्यकता होती है। पावर मैनेजर के लिए हमें यही करना था: dssw.co.uk/powermanager आप क्या हासिल करने की उम्मीद कर रहे हैं?
ग्राहम मिलन

शीर्षक में जो कहते हैं उसे हासिल करने की उम्मीद: किसी अन्य उपयोगकर्ता के सत्र में एक गुई एप्लिकेशन लॉन्च करें । "बोनस अंक" यदि अन्य उपयोगकर्ता को लॉग इन करने की आवश्यकता नहीं है या यदि इसे प्रोग्रामेटिक रूप से लॉग इन किया जा सकता है। विशिष्ट रूप से, मुझे एकाधिक Google ड्राइव चाहिए। यह काम करता है अगर मैं बस मैन्युअल रूप से लॉग इन करता हूं और यह सिस्टम वरीयताएँ पर उस उपयोगकर्ता के लॉगिन आइटम के तहत है । एक trampoline प्रक्रिया बोनस अंक नहीं लाएगी, लेकिन अगर यह एकमात्र तरीका है, तो ठीक इसके विपरीत Apple इंजीनियरों की सिफारिश क्या है? मैंने सोचा कि इस तरह की सरल हैक स्क्रिप्ट करने के लिए यह ठीक होगा! : पी
क्रैगॉक्स

@ कव्वा कृपया इसे एक नया प्रश्न मानें और यह ध्यान रखें कि यह कैसे प्राप्त किया जा सकता है, इसके बजाय कई Google ड्राइव को वांछित करने के लक्ष्य पर ध्यान केंद्रित करें। फोकस में बदलाव से प्रश्न को डुप्लिकेट के रूप में चिह्नित नहीं किया जा सकेगा।
ग्राहम मिलन

उचित और पर्याप्त किया
क्रेगॉक्स

7

पोर्ट कैपेसिटी प्रोटेक्शन (SIP) पोर्ट को बंद करने के कारण El Capitan (10.11) पर काम के ऊपर कोई भी bsexec उत्तर नहीं है। "लॉन्चक्टल एसेसर" काम करता है, लेकिन इसे रूट के रूप में चलाने की आवश्यकता होती है। नीचे एल कैप्टान (और हाल ही में OS-es) पर काम करता है:

sudo launchctl asuser 501 open /Applications/Calculator.app

ध्यान दें कि 501 मेरे अन्य उपयोगकर्ता के लिए उपयोगकर्ता नाम है।


यह मेरा परिणाम है: bruno.medeiros@brunojcm-macbook:~ $ sudo launchctl asuser 501 open /Applications/Firefox.appऔर मिल गयाLSOpenURLsWithRole() failed with error -600 for the file /Applications/Firefox.app
ब्रूनो जेसीएम

@BrunoJCM क्या आप सुनिश्चित हैं कि जिस उपयोगकर्ता के साथ आप इसे खोलना चाहते हैं, उसके लिए 501 उपयोगकर्ता आईडी कोड है? यह एक थोड़ा और अधिक स्पष्ट है, तो आदेश की तरह कुछ है: sudo launchctl asuser $(id -u <user_id_name>) <app>। उस ने कहा, मुझे एक अलग त्रुटि मिलती है, posix_spawn(): 13: Permission deniedभले ही मैं उसी उपयोगकर्ता आईडी के साथ sudo launchctl asuser $(id -u mtylutki) /Applications/Calculator.app
मार्कस

2

अंत में १०.१० एक सही "लॉन्चक्टल बाइसेक" प्रदान करता है जो कार्यान्वयन यो उपयोग कर सकता है:

sudo /bin/launchctl bsexec PID chroot -u UID -g GID / open /Applications/TextWrangler.app

आदमी कहता है

यह दिए गए कमांड को निष्पादन पीआईडी ​​के समान संभव के रूप में लक्षित पीआईडी ​​के रूप में निष्पादित करता है।

तो PID परम के रूप में आप उपयुक्त लॉगिनविंडो प्रक्रिया के pid का उपयोग कर सकते हैं । यूआईडी उपयोगकर्ता की उपयोगकर्ता आईडी है जो लॉगिनविंडो का मालिक है और जीआईडी ​​यह प्राथमिक समूह है।

यह किसी भी कमांड के लिए और निश्चित रूप से लॉन्च की गई नौकरियों के लिए ठीक काम करता है (fe launchagents) भी अंतिम बार की तरह:

/bin/launchctl bsexec 104 chroot -u 501 -g 20 / /bin/launchctl load -S Aqua /Library/LaunchAgents/com.youragent.plist 2>&1

यकीन नहीं होता कि यह दूसरों के लिए सच है, लेकिन मुझे इसके लिए task_for_pid(): 0x5अब एक त्रुटि मिलती है , जहां मैंने सत्यापित किया है कि पीआईडी ​​सही है।
मार्कस

1

आप सही अनुमतियों के लिए होस्ट के रूप में फ़ाइंडर का उपयोग कर सकते हैं osascript -e "tell application \"Finder\" to open (\"${app}\" as POSIX file as alias)"। इस तरह यह जो भी GUI संदर्भ को खोजक लॉन्च किया के माध्यम से लॉन्च करेगा।


0

यह ssh के माध्यम से काम करता है:

#!/bin/bash

PID=$(ps auxwww | egrep "^bar" |\
fgrep /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow |\
awk '{print $2}')

sudo launchctl bsexec "$PID" open -a TextEdit

लेकिन अगर इसे टर्मिनल.app के माध्यम से आज़माते हैं, तो यह वर्तमान उपयोगकर्ता के GUI में TextEdit को खोलता है।

यदि आप सुनिश्चित नहीं हैं कि sshसक्षम है, तो आप इसे अस्थायी रूप से सक्षम कर सकते हैं

sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

और यदि आवश्यक हो तो इसे फिर से अक्षम करें?

वरना मैं लड़खड़ा गया।

10.9 पर परीक्षण किया गया।


यह आपके कहे अनुसार एप्लिकेशन को खोलता है, लेकिन इसे वर्तमान उपयोगकर्ता सत्र में खोलता है, और अन्य उपयोगकर्ता के सत्र में नहीं पूछा जाता है।
क्रैगॉक्स

-1

सरल

सूदो सु नाम_फूसर

फिर सामान्य रूप से कमांड निष्पादित करें।


कमांड द्वारा चलाया जाएगा bar, लेकिन अभी भी fooग्राफिकल सत्र में चलेगा ।
जॉन एन

क्षमा करें, प्रश्न के बारे में हाँ im भ्रमित, foo चित्रमय सत्र पर निष्पादित नहीं है।
PandB सॉफ्टवेयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.