Як запустити скрипт за допомогою cron або startd для облікового запису гостя в El Capitan


1

Не вдалося знайти спосіб виконання сценарію для гостьового акаунта під час входу в систему, який виконується щохвилини. Вони кажуть, що використання демона cron застаріле, тому, схоже, я буду використовувати запускати файли .plist.

Сценарій: Я маю загальнодоступний iMac. Я хочу дозволити широкій публіці використовувати гостьовий обліковий запис і примушувати його виходити кожні півгодини. Я написав рубіновий сценарій, щоб перевірити час входу та з’ясувати час, що залишився. Я можу його відображати сповіщення про банер кожні 10 хвилин за допомогою osascript, а потім змусити його вийти з мого облікового запису. Проблема полягає в тому, що я намагаюся реалізувати його для гостьового акаунта, він не працює.

Проблема полягає в тому, що я розміщую .plist файл всередині / Library / LaunchDaemons, оскільки він працює після входу в систему, а також працює як root. Запуск як root є важливим, оскільки я можу мати привілей вимикати процеси, коли закінчується час. Мені потрібно це виконувати раз на хвилину. Це поточний файл плісту, який працює, коли я ввійшов як власне ім'я користувача "власник", але не як гість. Використання 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>

Як тест, щоб переконатися, що спливає банер повідомлень oascript, у мене цей код всередині / usr / local / bin / notify-custom

#/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, який ви показуєте, неможливо завантажити, оскільки не вказано ні програми, ні ключа ProgramArguments.
користувач3439894

Вибачте за це, я знаю, що забув вставити цей розділ. Дивіться версію вище. (Змушує мене подумати, можливо, я повинен спробувати використовувати ключові ProgramArguments, а за ними лише один елемент масиву, який є ім'ям програми, оскільки він не має інших аргументів.)
Mickey D

Що таке notify-customі чи це двійковий чи сценарій, і якщо останній є вмістом сценарію?
користувач3439894

Це рубіновий сценарій. Це на роботі. Опублікуємо це завтра, якщо ви думаєте, що це допоможе.
Міккі Д

Я просто перевіряв з моїм власним .plist файлу, що належить rootв wheelгрупі з 0644дозволами на /Library/LaunchAgentsі він побіг , коли увійшов як Гість. За винятком рядка для програмного ключа, решта файлу була однаковою. Це спрацювало як очікувалося. Я також дивлюся на інші програми LaunchAgents у тому самому місці та перевіряю в "Моніторі активності", чи вони також почалися. Тож, не знаючи, що notify-customце таке та його зміст, я не можу запропонувати наразі інше, як сказати .plist файли, що /Library/LaunchAgentsпрацюють в обліковому записі гостей.
користувач3439894

Відповіді:


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 ...) запускається завдяки клавіші WatchPaths.

Оскільки завдання / сценарій / додаток має бути виконано як гість, ви не можете використовувати агенти запуску, оскільки шлях / Користувачі / Гість / Бібліотека / LaunchAgents / просто не існує.

Використовуйте замість демона запуску і запустіть його як Guest / _guest . Ваш рубіновий сценарій / usr / local / bin / notify-custom повинен бути читаним / виконуваним у всьому світі? звичайно.


Я також намагався виконувати завдання кожні 60 секунд - це працює належним чином, але видаляє деякі помилки після виходу гостя. Напевно, краще реалізувати всю справу в сценарії з рубіном. Залежно від сценарію, пробіг може змінюватися.

Якщо у вас є два різних завдання для виконання (наприклад, показуйте банер кожні 10 хвилин за допомогою Ruby та таймер, щоб вимусити виходити через 30 хвилин), ймовірно, краще створити два різних демона запуску.


Ви сказали: " Оскільки завдання / скрипт / додаток має бути виконано як гість, ви не можете використовувати агенти запуску, тому що шлях / Користувачі / Гість / Бібліотека / LaunchAgents / просто не існує ", і хоча це правда, все-таки моя. plist працював чудово з гостьового облікового запису, коли запускався з /Library/LaunchAgentsта без використання WatchPaths ключа , а також інші LaunchAgents робили з того самого місця.
користувач3439894

@ user3439894 Хм, мені дуже хочеться бачити сповіщення-звичай ... ;-)
klanomath

@ user3439894 Додатковою проблемою використання агента запуску є те, що агент / сценарій також виконується входом у систему як звичайний користувач - що, ймовірно, небажано.
кланомат

На машині, на якій я тестував це, у мене є 3 LaunchAgents /Library/LaunchAgents, один, який я створив для цього тесту, і 2 існуючих, які були додані програмами, що працюють в системі, наприклад, Little Snitch. Тож, загалом, я не бачу проблеми з використанням LaunchAgents для здійснення дій в обліковому записі гостей. Зважаючи /Library/LaunchAgentsна це , це, безумовно, може залежати від того, що саме намагається зробити, що може зробити використання LaunchAgents в цьому випадку використання сценарію не ідеально. Я можу лише пройти тестування, і воно працювало на мене таким чином, як я тестував. Не знаю, що ще можу сказати.
користувач3439894

0

Вирішено. Я над цим працюю деякий час. Моє рішення, нарешті, працює так, як мені потрібно, і це запускається під час входу в систему для користувача Гість (і як опція, я також запускаю його для себе, користувач iMac1, просто щоб відобразити вхід в систему). Я не бачив простого способу ввести файл org.user.plist в / Користувачі / Гість / Бібліотека / 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, оскільки без нього сценарій запустився, але зачекав хвилину, щоб запустити його першою подією. Якщо замість цього я використовував ключ WatchPaths, як зауважив @klanomath у своєму коментарі, то сценарій запускається кожні 10 секунд, оскільки їх активність має відбуватися в цій папці регулярно. Я просто хотів, щоб він працював кожні 60 секунд. Я можу змінити цей таймер пізніше, коли я очищую всю процедуру, використовуючи кілька барвистіших діалогових попереджень, написаних на Python.

Ось рубіновий код у / usr / local / bin / notify-custom, який виконується для кожного входу користувача:

#!/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, вони запускаються під системним кореневим обліковим записом, в той час як агенти працюють за обліковим записом користувачів. Використовуючи 2-й варіант, я повинен був дати дозволу гостя користувачеві дозвіл на запуск судового вимкнення, як зазначено нижче @klanomath. Це було зроблено за допомогою команди: $ sudo visudo та додавання наступного в кінці файлу:

Guest ALL=NOPASSWD: /sbin/shutdown

Також я хотів показати лише гостьовий рахунок на сторінці входу, щоб приховати свій обліковий запис із цього екрана за допомогою цієї команди:

sudo dscl . create /Users/hiddenuser IsHidden 1

і якщо ви передумаєте, можете повернути це:

sudo dscl . create /Users/hiddenuser IsHidden 0

Дякуємо @klanomath та @ user3439894

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.