запланированная блокировка учетной записи Mac OS X

Вы можете настроить свою учетную запись Mac OS X на автоматическую блокировку экрана, чтобы пароль требовался после определенного периода бездействия, но можете ли вы сделать то же самое, используя расписание (скажем, в 17:30 каждый день)? Это похоже на то, как вы можете включать/выключать компьютер или переходить в спящий режим/выходить из него в определенное время.

Ответы (3)

Вы можете использовать launchdдля этого. Поместите следующий xml в новый текстовый файл ~/Library/LaunchAgents/и назовите его описательным с суффиксом .plist. Например, мой ~/Library/LaunchAgents/logoutAt1730.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>Logout At 5:30 PM</string>
        <key>ProgramArguments</key>
        <array>
            <string>/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession</string>
            <string>-suspend</string>
        </array>
        <key>StartCalendarInterval</key>
        <dict>
            <key>Hour</key>
            <integer>17</integer>
            <key>Minute</key>
            <integer>30</integer>
        </dict>
    </dict>
    </plist>

Если вы хотите, чтобы он работал в текущем цикле питания (например, вы не хотите перезапускать, чтобы это вступило в силу), используйте, launchctl load ~/Library/LaunchAgents/logoutAt1730.plistчтобы сообщить launchdо новом элементе. Он должен загружаться автоматически при следующем входе в систему.

Используйте launchctl listи найдите строку метки (выход из системы в 17:30), чтобы подтвердить, что она launchdзнает об элементе.

Я проверил, что это работает на моей рабочей станции. Я не знаю, почему cronнет.

Да, это сработало, спасибо! Просто назвал файл suspend вместо logout. Теперь мне просто нужно получить подтверждение пользователя во всплывающем окне, если это возможно - я открою еще один вопрос: apple.stackexchange.com/q/49946/8699
Здесь возник новый вопрос, к вашему сведению: apple.stackexchange.com/q/51006/8699

РЕДАКТИРОВАТЬ: хотя я не уверен, почему cronне работает для этого конкретного варианта использования, этот ответ заменяется (в настоящее время более правильным) ответом с использованием launchd.

Используйте crontab -eв терминальном приложении, чтобы добавить /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspendв Crontab в нужное время, например так (для 17:30):

30 17 * * * /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend

Спасибо за подсказку, у меня не работает, но это уже другой вопрос. (Разве не должно быть 17 вместо 7 в 17:00?)
Ах да, я сделал это на лету. Хороший глаз. Я только что попробовал команду /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend, и она сработала. какую ОС вы используете?
Лев. Сама команда у меня тоже работала сама по себе, но я пробовал ставить crontab со временем на несколько минут вперед и ничего не происходило, когда наступало указанное время.
Хм, у меня такая же проблема. Я посмотрю на это сегодня вечером. Возможно, это будет работать как сценарий?
Не повезло там. Я думаю, что пользователь, запускающий cronjobs (root), не может вызвать приостановку для другого пользователя, по крайней мере, с помощью этой команды.
Вы можете сделать это с помощью root, используя su [имя пользователя] /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend
Пробовал эту команду в crontab, там тоже не повезло. Разве это не требует ввода пароля?
Это не должно быть корневым.
Может быть, попробуйте добавить к команде префикс «sudo -u username».

Я хотел что-то подобное, но вместо того, чтобы всегда блокироваться в определенное время, я хотел блокировать только при определенных условиях. Сценарий, который я использовал для проверки этих условий, запускался cron, поэтому у меня была та же проблема.

Когда я попытался CGSession -suspendзапустить cronjob и заметил, что когда он был запущен, Console.app зарегистрировал ошибку, в которой говорилось, что только root и текущий зарегистрированный пользователь могут вызвать быстрое переключение пользователей. Итак, мое решение: запустить его как root.

Итак, в моем сценарии я использовал следующее, чтобы заблокировать компьютер:

sudo /usr/bin/osascript -e 'tell application "System Events" to do shell script "/System/Library/CoreServices/Menu\\ Extras/User.menu/Contents/Resources/CGSession -suspend"'

Запутанный? Да. Работающий? Положительно!

Использование sudo .../CGSession -suspendнапрямую (без использования AppleScript) тоже не сработало?
Да, это не так. Не знаю, почему.