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


2

मैं एक LaunchAgent कॉपी से एक स्क्रिप्ट रूट के रूप में चलाने .plistके लिए /Users/xyz/Library/LaunchAgents

अगर मैं उस launchctlउपयोगकर्ता के रूप में लॉग इन xyzकरता हूं जो समस्याओं के बिना काम करता है। यदि मैं इसे स्क्रिप्ट से निम्नलिखित कमांड के साथ लोड करने का प्रयास करता हूं:

sudo -u xyz launchctl load /Users/xyz/Library/LaunchAgents/x.y.z.plist

यह काम नहीं करता है। त्रुटि संदेश है

Could not open job overrides database at /private/var/db/launchd.db/com.apple.launchd.peruser.0/overrides.plist: 13: Permission denied  
launch_msg(): Socket is not connected

क्या मेरे कार्य को पूरा करने का कोई अन्य तरीका है?


क्या आप इसे ले जा सकते हैं /Library/LaunchAgents/और एक UserNameकुंजी जोड़ सकते हैं ?
21

जवाबों:


4

यह मुझे लगता है कि अनुमतियाँ त्रुटि सिर्फ एक बहुत गहरी समस्या का एक लक्षण है: आप आइटम को गलत मच बूटस्ट्रैप संदर्भ में लोड करने का प्रयास कर रहे हैं । विशेष रूप से, आप लॉन्च कमांड को xyz के रूप में चला रहे हैं, लेकिन यह आइटम को रूट के संदर्भ में लोड करने की कोशिश कर रहा है, जिसे xyz के पास अनुमति नहीं है। आप जो चाहते हैं वह वस्तु को xyz के संदर्भ में लोड करना है (जिसके लिए xyz के पास अनुमतियाँ होनी चाहिए)।

ठीक है, मुझे थोड़ा बैक अप करें, और आपको ओएस एक्स में लॉन्च किए गए पदानुक्रम का एक सारांश प्रदान करता है। जब ओएस बूट होता है, तो यह लॉन्च का एक मास्टर उदाहरण ("सिस्टम" लॉन्च) शुरू करता है, जो आइटम से लोड करता है विभिन्न पुस्तकालय / LaunchDaemons फ़ोल्डर।

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

जब आप उपयोग करते हैं sudo -u xyz ..., तो यह उपयोगकर्ता आईडी को xyz पर स्विच करता है, लेकिन xyz के संदर्भ में स्विच नहीं करता है।

अब, यहाँ कुछ मामले हैं: पहला, अगर xyz लॉग इन नहीं हुआ है (यानी एक सक्रिय सत्र नहीं है), उनके पास बूटस्ट्रैप संदर्भ या एक लॉन्च उदाहरण नहीं है, इसलिए आप लोड नहीं कर सकते LaunchAgent उनके रूप में। मूल रूप से, LaunchAgents उपयोगकर्ता सत्रों में लोड करता है, इसलिए यदि कोई सत्र नहीं है तो इसे लोड करने के लिए कुछ भी नहीं है। दूसरी ओर, यह एक समस्या नहीं होनी चाहिए: अगली बार जब xyz लॉग इन करता है, तो आपका आइटम स्वचालित रूप से लोड हो जाएगा (जब तक यह सही जगह पर है)।

Xyz तो है में लॉग इन, आप अपने सत्र के भीतर कुछ प्रक्रिया की प्रक्रिया आईडी प्राप्त कर सकते हैं, और प्रयोग launchctl bsexecहै कि इस प्रक्रिया के बूटस्ट्रैप संदर्भ के लिए स्विच करने के लिए (और उसके बाद का उपयोग sudo -u xyzxyz को UIDs स्विच करने के लिए, और फिर आइटम लोड):

loadUser=xyz
loadPID=$(ps -axj | awk "/^$loadUser / {print \$2;exit}")
launchctl bsexec $loadPID sudo -u $loadUser launchctl load /Users/xyz/Library/LaunchAgents/x.y.z.plist

2

मुझे पता चला कि आप इसे दो चरणों में कर सकते हैं।

पहले सूडो में root

sudo -s

फिर उपयोगकर्ता को प्रतिरूपित करें

su -l user

स्पष्ट रूप से जो सही संदर्भ और launchctlकार्यों को स्थापित करता है।

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