एल कैपिटन में अतिथि उपयोगकर्ता खाते के लिए क्रोन या लॉन्च का उपयोग करके स्क्रिप्ट कैसे चलाएं


1

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

परिदृश्य: मेरे पास एक सार्वजनिक आईमैक है जिसे मैं आम जनता को अतिथि खाते का उपयोग करने की अनुमति देना चाहता हूं और यह हर आधे घंटे में लॉग आउट करने के लिए मजबूर करता है। मैंने लॉगिन समय की जांच करने और शेष समय का पता लगाने के लिए एक रूबी स्क्रिप्ट लिखी। मेरे पास ऑसस्क्रिप्ट का उपयोग करके हर 10 मिनट में एक बैनर अधिसूचना प्रदर्शित हो सकती है और फिर इसे मेरे खाते से लॉग इन कर सकते हैं। समस्या यह है कि जब मैं इसे काम नहीं करता अतिथि खाते के लिए इसे लागू करने की कोशिश।

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

मेरी मूल .plist फ़ाइल कुछ इस तरह दिखती थी

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Label</key> 
        <string>org.user</string> 
    <key>Program</key> 
        <string>/usr/local/bin/notify-custom</string> 
    <key>RunAtLoad</key> 
        <true/> 
</dict> 
</plist>

अद्यतन 1 (अभी तक कोई समाधान नहीं) .plist फ़ाइल जो अतिथि और मेरे उपयोगकर्ता नाम दोनों के लिए प्रत्येक 10 सेकंड चलती है

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
        <string>org.user</string>
    <key>ProgramArguments</key>
        <string>/usr/local/bin/notify-custom</string>
    <key>WatchPaths</key>
        <array>        
            <string>/Users/Guest/Library</string>
            <string>/Users/owner/Library</string>
        <array>
    </integer>
</dict>
</plist>

परीक्षण के रूप में यह सुनिश्चित करने के लिए कि ऑसस्क्रिप्ट नोटिफिकेशन बैनर पॉप अप करता है, मेरे पास यह कोड है / usr / लोकल / बिन / नोटिफाइड-कस्टम

#/bin/bash

#Using whoami would have shown me logged in as root under LaunchDaemon .plist
loggedinUser=`finger | awk 'NR==3{print $1}'`
#I need to manually run terminal and type sudo as guest for nextline to work
sudo -u $loggedinUser /usr/bin/osascript -e 'display notification "Test" with title "Banner Notification"'

समाधान नीचे है।


.Plist फ़ाइल जो आप दिखा रहे हैं वह संभवत: लोड नहीं कर सकता क्योंकि न तो कोई प्रोग्राम है और न ही कोई प्रोग्रामएरगमेंट कुंजी निर्दिष्ट है।
user3439894

इसके बारे में क्षमा करें कि मुझे पता है कि मैं उस अनुभाग को चिपकाना भूल गया था। ऊपर संशोधन देखें। (मुझे लगता है कि हो सकता है कि मैं इसके बजाय केवल एक सरणी तत्व प्रोग्राम नाम होने के बाद प्रमुख ProgramArguments का उपयोग करने की कोशिश करूं क्योंकि यह कोई अन्य तर्क नहीं लेता है।)
मिकी डी

क्या है notify-customऔर यह एक द्विआधारी या एक स्क्रिप्ट है, और यदि बाद में स्क्रिप्ट की सामग्री क्या है?
user3439894

यह एक रूबी लिपि है। यह काम पर है। कल इसे यहाँ पोस्ट करेंगे यदि आपको लगता है कि यह मदद करेगा।
मिकी डी

मैं बस अपना खुद का .plist फ़ाइल, के स्वामित्व के साथ परीक्षण rootमें wheelसाथ समूह 0644में अनुमतियों के लिए /Library/LaunchAgentsऔर जब अतिथि के रूप में लॉग-इन यह भाग गया। प्रोग्राम कुंजी के लिए स्ट्रिंग के अपवाद के साथ शेष फ़ाइल समान थी। यह उम्मीद के मुताबिक काम किया। मैं एक ही स्थान पर अन्य LaunchAgents को भी देखता हूं और गतिविधि मॉनिटर में उनकी प्रक्रियाओं को भी शुरू कर रहा हूं। तो यह जाने बिना कि इसकी सामग्री क्या है और इसके अलावा, मैं इस समय अन्य पेशकश करने के लिए प्रस्ताव कर सकता हूं । अतिथि खाते में काम करने वाली फाइलें । notify-custom/Library/LaunchAgents
user3439894

जवाबों:


1

मेरी राय में निम्नलिखित काम करना चाहिए - यह मेरे वीएम में करता है! - /Library/LaunchDaemons/org.user.plist के रूप में लॉन्च किया गया:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>org.user</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/touch</string>
        <string>-f</string>
        <string>/Users/Guest/Desktop/test.txt</string>
    </array>
    <key>UserName</key>
    <string>Guest</string>
    <key>GroupName</key>
    <string>_guest</string>
    <key>InitGroups</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/Users/Guest/Library</string>
    </array>
</dict>
</plist>

उदाहरण कार्य के रूप में मैं का उपयोग करें /usr/bin/touch -f /Users/Guest/Desktop/test.txt

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

चूंकि कार्य / स्क्रिप्ट / ऐप को अतिथि के रूप में निष्पादित किया जाना है, इसलिए आप लॉन्च एजेंटों का उपयोग नहीं कर सकते क्योंकि पथ / उपयोगकर्ता / अतिथि / लाइब्रेरी / लॉन्चअगेंट / बस मौजूद नहीं है।

इसके बजाय एक लॉन्च डेमॉन का उपयोग करें और इसे अतिथि / _guest के रूप में चलाएं । आपकी रूबी लिपि / usr / लोकल / बिन / नोटिफ़िकेशन-कस्टम को विश्व पठनीय / निष्पादन योग्य होना चाहिए? बेशक।


मैंने हर 60 सेकंड में कार्य को चलाने की कोशिश की - जो ठीक से काम करता है, लेकिन मेहमान के लॉग आउट के बाद कुछ त्रुटियां फेंकता है। संभवत: रूबी लिपि में पूरी बात को लागू करना बेहतर है। आपकी स्क्रिप्ट के आधार पर आपका माइलेज भिन्न हो सकता है।

यदि आपके पास निष्पादित करने के लिए दो अलग-अलग कार्य हैं (जैसे कि रूबी के साथ हर 10 मिनट में एक बैनर दिखाते हैं और 30 मिनट के बाद लॉग आउट करने के लिए एक टाइमर है) तो शायद दो अलग-अलग लॉन्च डेमॉन बनाना बेहतर है।


आपने कहा, " चूंकि टास्क / स्क्रिप्ट / ऐप को गेस्ट के रूप में निष्पादित किया जाना है, इसलिए आप लॉन्च एजेंटों का उपयोग नहीं कर सकते क्योंकि पथ / उपयोगकर्ता / अतिथि / लाइब्रेरी / लॉन्चअगेंट / बस मौजूद नहीं है। " और जबकि यह सच है फिर भी मेरा है। जब से /Library/LaunchAgentsऔर साथ ही अन्य LaunchAgents एक ही स्थान से किया था की WatchPaths कुंजी के उपयोग के बिना चलाने के अतिथि खाते के भीतर से ठीक भाग गया ।
user3439894

@ user3439894 हम्म मैं सूचना-रिवाज देखने के लिए बहुत उत्सुक हूँ ... ;-)
klanomath

@ user3439894 एक लॉन्च एजेंट का उपयोग करने की एक अतिरिक्त समस्या यह है कि एजेंट / स्क्रिप्ट को सामान्य उपयोगकर्ता के रूप में लॉगिंग भी निष्पादित किया जाता है - जो संभवतः अवांछित है।
क्लानोमथ

जिस मशीन पर मैंने यह परीक्षण किया है /Library/LaunchAgents, उसमें 3 लॉन्चएगेंट हैं , एक मैंने इस परीक्षण के लिए बनाया है और 2 मौजूदा हैं जो सिस्टम पर चल रहे एप्लिकेशनों द्वारा जोड़े गए हैं, जैसे लिटिल स्निच। इसलिए, सामान्य तौर पर मुझे Guest खाते में कार्रवाई करने के लिए LaunchAgents का उपयोग करके कोई समस्या नहीं दिखाई देती है। उस ने कहा, यह निश्चित रूप से इस बात पर निर्भर कर सकता है कि कोई ऐसा करने की कोशिश कर रहा है जो /Library/LaunchAgentsइस उपयोग के मामले में एक LaunchAgents का उपयोग कर सकता है आदर्श नहीं। मैं केवल अपने परीक्षण से जा सकता हूं और इसने मेरे लिए मेरे परीक्षण के तरीके पर काम किया। पता नहीं मैं और क्या कह सकता हूं।
user3439894

0

हल किया। मैं इस पर कुछ समय से काम कर रहा हूं। मेरा समाधान अंत में मेरी आवश्यकता के अनुसार होता है और यह उपयोगकर्ता अतिथि के लिए लॉगिन के दौरान शुरू होता है (और एक विकल्प के रूप में मेरे पास यह भी है कि मैं खुद को शुरू करने के लिए उपयोगकर्ता iMac1 के लिए शुरू करूं)। मुझे org.user.plist फ़ाइल को / Users / Guest / Library / LaunchAgents में डालने का एक सरल तरीका नहीं दिखाई दिया, जिसे सैद्धांतिक रूप से उस समय लॉन्च किया जाएगा जब अतिथि ने लॉग इन किया था और उस स्थिति के कारण मैंने उस फ़ोल्डर को छोड़ दिया था लॉगिन तक नहीं बनाया गया है।

मैंने जो किया वह मेरी .plist फ़ाइल को अंदर / लाइब्रेरी / LaunchAgents / जो प्रत्येक उपयोगकर्ता के लिए चलाया जाता है। यह ठीक है क्योंकि मेरा कोड अतिथि उपयोगकर्ता को अलग कर देगा और कार्रवाई करेगा (इस मामले में उन्हें निर्धारित समय के बाद लॉग आउट करेगा।)

अंतिम .plist फ़ाइल:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
        <string>org.user</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/notify-custom</string>
    </array>
    <key>RunAtLoad</key>
        <true/>
    <key>StartInterval</key>
        <integer>60</integer>
</dict>
</plist>

ध्यान दें कि मैंने एक RunAtLoad कुंजी को जोड़ा क्योंकि इसके बिना स्क्रिप्ट चलती थी लेकिन आग लगने का एक मिनट इंतजार करती थी यह पहली घटना है। अगर इसके बजाय मैंने वॉचपैथ कुंजी का इस्तेमाल किया जैसा कि @klanomath ने अपनी टिप्पणी में उल्लेख किया है, तो स्क्रिप्ट हर 10 सेकंड चलेगी क्योंकि उनकी उस फ़ोल्डर में नियमित रूप से गतिविधि हो रही होगी। मैं बस यही चाहता था कि अब हर 60 सेकंड के लिए चला जाए। मैं उस टाइमर को बाद में बदल सकता हूं जब मैं पायथन में लिखे गए कुछ और रंगीन चेतावनी संवादों के साथ पूरी प्रक्रिया को साफ करता हूं।

यहाँ माणिक कोड / usr / लोकल / बिन / नोटिफ़िकेशन-कस्टम है जो हर उपयोगकर्ता लॉगिन के लिए निष्पादित होता है:

#!/usr/bin/ruby -w

require 'time'
require 'FileUtils'

loggedinUser=`finger|awk 'END{print $1}'`.strip
getloginTime=`finger|awk 'END{print}'|cut -c49-53`
getnowTime=`date|awk 'NR==1{print $4}'`[0..4]
loginTime=(Time.parse(getloginTime).to_i)
nowTime=(Time.parse(getnowTime).to_i)
diffSec=(nowTime-loginTime)
diffMin=(diffSec/60)
timeRemain=30-diffMin

#To see some console output while debugging
puts "getloginTime      =#{getloginTime}"
puts "getnowTime        =#{getnowTime}"
puts "loginTime=#{loginTime}"
puts "nowTime  =#{nowTime}"
puts "timeRemain=#{timeRemain}"

if loggedinUser == "Guest"
        open("/Users/#{loggedinUser}/Desktop/30 Minutes Max Use Per Day",'a'){|f| f.puts "With this new iMac, you are limited to a maximum of 1/2 hour use per day"}
        if timeRemain < 0
            `/usr/bin/osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/Library/Desktop Pictures/Earth Horizon.jpg"'`
            `/usr/bin/osascript -e 'display notification "SHUTTING DOWN! Now= #{getnowTime}   LoggedInAt=#{getloginTime}   TimeRemain=#{timeRemain}" with title "Guest SHUTTING DOWN" sound name "Glass"'`
            `/usr/bin/osascript -e 'tell app "Terminal" to do script "sudo shutdown -h now"'`
        else
            `/usr/bin/osascript -e 'display notification "Now= #{getnowTime}     TimeRemain=#{timeRemain}" with title "#{loggedinUser} TIME LOGGED IN= #{getloginTime}" subtitle "User= #{loggedinUser}"'`
        end
else
        `/usr/bin/osascript -e 'display notification "Now= #{getnowTime}     TimeRemain=#{timeRemain}" with title "#{loggedinUser} TIME LOGGED IN= #{getloginTime}" subtitle "User= #{loggedinUser}"'`
end

फिर से ध्यान दें कि यदि आप इसके बजाय LaunchDaemons का उपयोग करते हैं, तो वे सिस्टम रूट खाते के तहत चलते हैं, जबकि एजेंट उपयोगकर्ता के खाते में लॉग ऑन करते हैं। दूसरे विकल्प का उपयोग करते हुए मुझे अतिथि उपयोगकर्ता को नीचे दिए गए @klanomath के रूप में sudo शटडाउन चलाने की अनुमति देनी थी। यह कमांड चलाने के साथ किया गया था: $ sudo visudo और फाइल के अंत में निम्नलिखित जोड़ना:

Guest ALL=NOPASSWD: /sbin/shutdown

इसके अलावा, मैं केवल लॉग ऑन पेज पर अतिथि खाता दिखाना चाहता था, इसलिए मैंने इस आदेश के साथ अपना खाता उस स्क्रीन से छिपा लिया:

sudo dscl . create /Users/hiddenuser IsHidden 1

और यदि आप अपना मन बदलते हैं तो आप इसे वापस ला सकते हैं:

sudo dscl . create /Users/hiddenuser IsHidden 0

धन्यवाद @klanomath और @ user3439894

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